如何解决将未知大小的2D数组传递给函数的问题



我有一个程序,其中对象数组的大小在运行时确定,因此它是动态分配的(2D数组,从文件中读取)。我也有一个函数,它把这些对象作为参数。问题是,如果函数参数是传递给函数的二维数组,则应该确定第二维。然而,在我的情况下,它不是。我的程序不会编译,因为原型没有提到的第二次元。

这是我尝试的:

//global variables
int residentCount=0;
int hospitalCount=0;
Resident** residents;
Hospital** hospitals;
bool readFromFiles(const string, const string, const int); //sizes are determined in here
void print(Hospital*[hospitalCount], Resident*[residentCount]); //declaration issue

我该如何解决这个问题?

你正在用c++编程,所以你应该:
    在可能的情况下,避免动态分配和自己处理内存管理
    • 利用具有自动存储持续时间的对象,而是遵循RAII习惯用法
  • 避免使用C风格的数组,实际上避免编写只能作为c++编译的C代码
    • 使用c++提供的强大功能,特别是那些捆绑在STL
    • 中的功能。
  • 当本地变量足够时避免使用全局变量

应该是这样的:

typedef std::vector<Resident> Residents;
typedef std::vector<Hospital> Hospitals;
// passing by const reference:
void print(const std::vector<Hospitals>&, const std::vector<Residents>&);
int main()
{
    std::vector<Hospitals> hospitals;
    std::vector<Residents> residents;
    ...
} // <-- lifetime of automatics declared within main ends here

注意,hospitalsresidents将是具有自动存储持续时间的对象,其使用方式与c风格的2D数组类似。当执行超出main的作用域时,这些向量被销毁,并且内存中它们之前所在的元素(包括它们元素的元素)被自动清除。

还请注意,我建议您通过const引用传递,即const std::vector<Hospitals>&,它可以防止创建传递对象的副本,并且const关键字显式地告诉调用者:"虽然您通过引用传递此对象,但我不会更改它。"

只需传递一个指向数组的第一个元素和维度的指针,这就足够了,例如:

void PrintHospitals(Hospital* Hospitals, size_t HospitalRows, size_t HospitalColumns)
{
  size_t i, j;
  Hospital* hospital;
  for (i = 0; i < HospitalRows; i++)
    for (j = 0; j < HospitalColumns; j++)
    {
      hospital = Hospitals + HospitalColumns * i + j;
      PrintHospital(hospital);
    }
}
int main()
{
  Hospital hospitals[10][20];
  // ...
  PrintHospitals(&hospitals[0][0], 10, 20);
  return 0;
}

下面是使用模板为现有数据创建二维数组包装器的解决方案:

template<typename T>
class Array2d {
  public:
  int Rows;
  int Cols;
  T** Data;
  Array2d(int rows, int cols, T** data) :
    Rows(rows),
    Cols(cols),
    Data(data) { }
};
void print(Array2d<Hospital> h, Array2d<Resident> r) {
  for (int i = 0; i < h.Rows; i++) {
    for (int j = 0; j < h.Cols; j++) {
      //Print Data[i][j] element here
    }
  }
  // Other print code
}
int main()
{
   Resident** residents;
   Hospital** hospitals;
   //Init data arrays
   Array2d<Hospital> h(10, 10, hospitals);
   Array2d<Resident> r(10, 10, residents);
   print(h, r);
}

相关内容

  • 没有找到相关文章