dポイントプレゼントキャンペーン実施中!

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: 配列または、ポインタでない変数に添字が使われました。
というエラーがでます。動的メモリの確保の仕方がまずいのでしょうか?
どなたか教えて頂けますでしょうか?よろしくお願いします。

A 回答 (3件)

そもそも、今回の件で、メモリーを動的に確保する必要があるのでしょうか?

    • good
    • 0

> 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ってどこにもないよ?
    • good
    • 0
この回答へのお礼

無事解決できました!
ありがとうございました。
まだ、エラーの意味を理解することも出来てない状態なので、
さらに勉強したいと思います。
あと、delete[] dataではなく、matrixの間違いでした。

お礼日時:2009/09/06 14:45

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];
これをクラス化すれば使いやすくなるかもです。

以上参考になったら幸いです。
多分大丈夫だと思いますがどこか間違ってたらすいません。
    • good
    • 0
この回答へのお礼

なるほど!そういう考え方もあるわけですね。
アドバイスありがとうございました。

お礼日時:2009/09/06 21:46

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!