- 締切済み
三次元配列の動的メモリの確保?
const int SLICE=2; const int SIZE=256; signed short int *matrix=new signed short int[SLICE][SIZE][SIZE]; for(int i=0; i<SLICE; i++){ for(int j=0; j<SIZE; j++){ for(int k=0; k<SIZE; k++){ fin.read((char*) &matrix[SLICE][SIZE][SIZE],sizeof(signed short int)); } } } delete[] data; 三次元データを読み込むために、三次元配列を使って読み込もうとしたのですが、上手く読み込めません。 三行目の所で、error C2440: '初期化中' : 'short (*)[256][256]' から 'short *' に変換できません。 七行目の所で、error C2109: 配列または、ポインタでない変数に添字が使われました。 というエラーがでます。動的メモリの確保の仕方がまずいのでしょうか? どなたか教えて頂けますでしょうか?よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- asuncion
- ベストアンサー率33% (2127/6289)
そもそも、今回の件で、メモリーを動的に確保する必要があるのでしょうか?
- Gotthold
- ベストアンサー率47% (396/832)
> signed short int *matrix=new signed short int[SLICE][SIZE][SIZE]; エラーメッセージの通り、左辺の型がおかしい。(3次元配列なのに short * 型を使ってる。) ちゃんと short (*)[256][256] 型の変数に代入しましょう。 signed short int (*matrix)[SIZE][SIZE] = new signed short int[SLICE][SIZE][SIZE]; あと、ループ内でmatrix[SLICE][SIZE][SIZE]を使ってるけど、これはメモリ確保されていないので使用できない領域です。 ここはi,j,kを使う所じゃないの? それと最後のdelete[] data; の dataってどこにもないよ?
- LOHA
- ベストアンサー率52% (203/388)
newでの動的メモリ確保は多次元はサポートしていないと思われます(すいません、詳しくは調べてません)。 なので、1次元ずつメモリ確保をする必要があると思います。 二次元なら int** a = new int*[2]; for (int i = 0; i < 2; ++i) a[i] = new int[5]; の様な感じですかね。三次元でも要領は同じです。 まぁC++なのでstd::vector使っておくのが無難だと思いますけどね。 あとは1次元で管理する方法もありますね。 const int SLICE=2; const int SIZE=256; int a[SLICE * SIZE]; // [1][5]なら int val = a[SLICE * 1 + 5]; これをクラス化すれば使いやすくなるかもです。 以上参考になったら幸いです。 多分大丈夫だと思いますがどこか間違ってたらすいません。
お礼
なるほど!そういう考え方もあるわけですね。 アドバイスありがとうございました。
お礼
無事解決できました! ありがとうございました。 まだ、エラーの意味を理解することも出来てない状態なので、 さらに勉強したいと思います。 あと、delete[] dataではなく、matrixの間違いでした。