1

我正在尝试声明两个数组,一个 2D 和一个 1D。我知道尺寸需要是 const 值。所以 const 值是从函数调用的返回值中分配的。这很顺利,但是当我使用派生值声明数组时,编译错误!为什么???

这是我的代码:

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];
    }

感谢所有帮助。

4

2 回答 2

0

任何数组中第二维、第三维等的大小始终是恒定的。时期。标准对此非常明确。

如果您在堆上以 new 数组形式分配变量,则第一个维度(实际上是最后一个索引)可以是变量,如下所示:

int size = 50;
float *p = new float[size];

.... do stuffs

delete[] p;

一些编译器允许在堆栈上使用可变大小的数组,但最好不要使用它。

于 2012-07-17T15:45:11.467 回答
0

编译器对数组的恒定大小强制执行此规则,因为它在编译时分配所需的内存。换句话说,计算数组大小所需的所有值必须在编译时已知。在您的第一个示例中,情况并非如此,因此编译器会抱怨。

如果你真的需要动态大小的数组,你应该使用指针和 new[] 操作符来分配数组。您还需要记住使用 delete[] 运算符将内存返回给系统并避免任何内存泄漏。

于 2012-07-17T15:54:27.620 回答