2012-07-17 78 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