3

C++ での 2D 動的配列の作成に問題があります。「行」の動的数(numRなど)と「列」の固定数(2など)が必要です。

私はこのようにしてみました:

const numC = 2;
int numR;
numR = 10;
double *myArray[numC];
myArray = new double[numR];

残念ながら、うまくいきません。そのような方法でそれを行うことは可能ですか?

もちろんdouble **myArray、両方の次元が動的であるかのように使用して初期化することもできますが(ループでnumCをリミッターとして使用)、可能であれば避けたいと思います。

前もって感謝します。

4

4 に答える 4

6

そのような方法でそれを行うことは可能ですか?

はい:

double (*myArray)[numC] = new double[numR][numC];
// ...
delete[] myArray;

これは少し変わっているように見えるかもしれませんが、5.3.4 §5 は明確に述べています:

のタイプnew int[i][10]int (*)[10]

多くのプログラマーは C 宣言子の構文に精通しておらず、このコードを理解できないことに注意してください。また、手動の動的割り当ては例外セーフではありません。これらの理由から、配列のベクトルの方が優れています。

#include <vector>
#include <array>

std::vector<std::array<double, numC> > vec(numR);
// ...
// no manual cleanup necessary

コンパイラに応じて、std::arrayまたはstd::tr1::arrayに置き換えます。boost::array

于 2010-11-23T18:26:28.210 に答える
2

std::vectorを使用して、そのコンストラクターを利用しない理由:

std::vector<std::vector<int> > my2Darray(2, std::vector<int>(10));
my2Darray[0][0] = 2;
于 2010-11-23T14:21:44.053 に答える
1

列ごとに配列を作成する必要があるため、ループが必要です。

あなたが求めているのは次のとおりだと思います:

double *myArray[numC];
for (int i = 0; i < numC; i++) {
    myArray[i] = new double[numR];
}

// some code...

// Cleanup:
for (int i = 0; i < numC; i++) {
    delete [] myArray[i];
}

これは、要素を持つポインター ( へのdouble)の配列を宣言し、 の各列の要素を持つnumCの配列を作成します。使い終わったら、メモリを解放することを忘れないでください。そうしないと、メモリ リークが発生します。doublenumRmyArray

于 2010-11-23T14:20:29.997 に答える
-1

インデックスは行、次に列にする必要があります。

double** myArray = new double*[numR];
for( unsigned int i = 0; i < numR; i++ ) {
    myArray[i] = new double[numC];
}

行 2、列 5 にアクセスします。

myArray[2][5];
于 2010-11-23T14:21:55.363 に答える