我正在尝试声明两个数组,一个2D和一个1D。我知道尺寸需要是const值。因此,const值是从函数调用的返回值赋值的。这很好,但是当我使用派生值来声明数组时,COMPILE错误! WHY ???
这是我的代码:
int populateMatrixFromFile(string fname) {
std::ifstream fileIn;
int s = determineDimensions(fname); // return value (CONST INT)
const int size = s; // assign to const
cout << "Value returned from determineDimensions(): " << size << endl;
if (size > 10){
cout << "Maximum dimensions for array is 10 rows and 10 columns. Exiting" << endl;
return 1;
}
fileIn.open(fname.c_str(), ios::in); //opened for reading only.
float aMatrix[size][size]; // ERROR
float bMatrix[size]; // ERROR
但它可以在这里工作:
// assign the pth row of aMatrix to temp
const int alen = sizeof (aMatrix[p]) / sizeof (float);
float temp[alen]; // WORKS!!!
for (size_t i = 0; i < alen; i++) {
temp[i] = aMatrix[p][i];
}
感谢您的帮助。
答案 0 :(得分:0)
任何数组中第二维,第三维等的大小始终是常量。期。标准非常明确。
如果在堆上使用new的数组形式分配变量,第一个维度(实际上是最后一个索引)可以是变量的,如下所示:
int size = 50;
float *p = new float[size];
.... do stuffs
delete[] p;
有些编译器允许在堆栈上使用可变大小的数组,但最好不要使用它。
答案 1 :(得分:0)
编译器对数组的常量大小强制执行此规则,因为它在编译时分配所需的内存。换句话说,计算数组大小所需的所有值必须在编译时知道。在您的第一个示例中,情况并非如此,因此编译器会抱怨。
如果你真的需要动态大小的数组,你应该使用指针和new []运算符来分配数组。您还需要记住使用delete []操作符将内存返回给系统并避免任何内存泄漏。