• 締切済み

配列の受け渡しについて

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

みんなの回答

  • mooncake
  • ベストアンサー率100% (6/6)
回答No.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/170.html
hinebot
質問者

お礼

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

すると、全ての回答が全文表示されます。
  • hofuhofu
  • ベストアンサー率70% (336/476)
回答No.3

多次元配列を関数にポインタで渡そうとすると、結構面倒になる場合があります。 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さんのほうが簡単ですが、動的に変わる場合にはこういった方法もあります。

hinebot
質問者

お礼

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

すると、全ての回答が全文表示されます。
  • ranx
  • ベストアンサー率24% (357/1463)
回答No.2

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

hinebot
質問者

お礼

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

すると、全ての回答が全文表示されます。
  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.1

ポインタのポインタで渡せば2次元配列になるかと思いますが。 void fnc(int** matrix);

hinebot
質問者

お礼

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

すると、全ての回答が全文表示されます。

関連するQ&A