ある関数で、引数としてやりとりするデータが多いため、構造体にまとめて受け渡しするようにしています。
その構造体のメンバにポインタ変数を設け、2次元配列のポインタを受け渡しするようにしたいのですが、受け取った側でそのポインタを"2次元の配列"として扱うことができずに困っております。(2次元であることが認識できない?)
配列そのものを受け渡しする方法以外で、これを解決する手段はないでしょうか?
(ANSI-Cです)

A 回答 (4件)

ソースを見た訳じゃないので自信はないですが、


構造体のメンバで、二次元配列を受ける為のポインタは
どの様に宣言しましたか?

もし、 int **p; みたいにしていたらNGです。

例えば、int a[3][4]; の様な二次元配列があったとします。
この場合 a の型は、ポインタのポインタではなく int型4個分
へのポインタです。なので正しくは、

int (*p)[4]; の様に宣言します。

型があっていれば、p = a; とした時に警告も出ないはずです。
構造体で使う場合も、

struct Test {
int (*p)[4];
};

void func(struct Test *p_test)
{
printf("%d\n" , p_test->p[2][3] );

}
みたいに二次元配列としてアクセス出来ますがどうでしょう?
予めサイズが決まっていなかったら先に回答された方の例の
様に動的確保するのがいいと思います。

二次元配列の型に関しては、もしよかったら参考URLを見てく
ださい。わかりやすいと思います。

参考URL:http://mukun_mmg.at.infoseek.co.jp/mmg/bncpp/10/ …
    • good
    • 0
この回答へのお礼

分かりやすい回答ありがとうございます。
サイズは決まってますので、参考にさせていただきます。

お礼日時:2003/10/02 12:20

多次元配列を関数にポインタで渡そうとすると、結構面倒になる場合があります。


http://www.st.rim.or.jp/~phinloda/cqa/cqa17.html

ちなみに、
・送り側
char **matrix;
matrix = (char **)malloc(sizeof(char *) * 5);
for(i = 0; i < 5; i++)
matrix[i] = (char *)malloc(sizeof(char) * 5);
foo(matrix);

・受け側
void foo(char **matrix)
などとしてやれば、ポインタのポインタで渡しても、受け側関数foo内でmatrix[1][4]のように二次元配列として使うことができます。
厳密には二次元配列ではないので、添字に上限を上回る数を使ってもコンパイラはエラーを出してくれないですけど。
結構面倒な方法なので、配列の数が固定なら#2さんのほうが簡単ですが、動的に変わる場合にはこういった方法もあります。
    • good
    • 0
この回答へのお礼

丁寧な回答ありがとうございます。いろいろやってみたいと思います。

お礼日時:2003/10/02 12:17

最近Cから離れているので忘れかけていますが。



No.1さんのやり方ではポインタの配列になってしまいますね。
配列の数が分かっていれば、こんなやり方があります。
void called(int (*matrix)[5])
{
 matrix[3][2] = 1;
}

void caller()
{
 int matrix[5][5];
 called(matrix);
}
    • good
    • 0
この回答へのお礼

ありがとうございます。何とかなりそうです。

お礼日時:2003/10/01 20:25

ポインタのポインタで渡せば2次元配列になるかと思いますが。



void fnc(int** matrix);
    • good
    • 0
この回答へのお礼

ありがとうございます。参考にさせていただきます。

お礼日時:2003/10/01 20:24

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


人気Q&Aランキング

おすすめ情報