2012-07-17 73 views
1

我想声明两个数组,一个2D和一个1D。我知道维度需要是常量值。所以const值是从函数调用的返回值中分配的。这很好,但是当我使用派生值来声明数组时,COMPILE错误!为什么???定义一个常量/声明一个数组

这里是我的代码:

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

编译器强制执行这个关于数组常量大小的规则,因为它在编译时分配了所需的内存。换言之,在编译时必须知道计算数组大小所需的所有值。在你的第一个例子中,情况并非如此,所以编译器会抱怨。

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

+0

你*应该*使用'std :: vector'。 – chris 2012-07-17 15:55:00

+0

@chris当然,这是另一种选择,只要没有其他约束,例如这是一个不允许使用std :: vector的教室任务。 – 2012-07-17 16:01:56

0

任何数组中的第二维,第三等的大小始终保持不变。期。这个标准非常明确。

第一尺寸(实际上是最后一个索引),如果你在堆上分配变量随着新阵列形式,这样可以是可变的:

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

.... do stuffs 

delete[] p; 

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

+0

所以我可以删除第一个暗淡值?我试过了,但没有奏效。 – 2012-07-17 15:48:56

+0

如果你想要一个矩阵,你不能。您可以自己实现矩阵中的计算索引。在很多情况下,这并不困难。 – 2012-07-17 15:52:03

+0

你如何实现?谢谢。 – 2012-07-17 16:30:47