1

2D と 1D の 2 つの配列を宣言しようとしています。次元が const 値である必要があることはわかっています。そのため、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];
    }

助けてくれてありがとう。

4

2 に答える 2

0

配列の 2 番目、3 番目などのサイズは常に一定です。限目。基準はこれについて非常に明確です。

次のように、配列形式の 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 に答える