• ベストアンサー

配列のアドレス渡し

今までの質問にも似たような例がありましたがなかなか解決できません、教えてください。 下のプログラムを実行すると(省略アリ) #include<stdio.h> #include<string.h> #define N 32 char sort(char*,char*); main(int argc,char *argv[]) { char read[N*N],CASL[N][N][N]; sort(CASL,read); } void sort(char *CASL,char *read) { int i=0,j=0,k=0,z=0; while(1){ if(*(read+z) == '\0') break; else if(*(read+z) == ' '){ *(CASL+i*N*N+j*N+k) = '\0'; j++;k=0; } else if(*(read+z) == '\n'){ *(CASL+i*N*N+j*N+k) = '\0'; i++;j=0;k=0; } else{ *(CASL+i*N*N+j*N+k) = *(read+z); k++; } z++; } } warning: passing arg 1 of `sort' from incompatible pointer type のエラーメッセージがでてしまいます。関数間での受け渡しで発生しているエラーだと思うのですが、どこを直せばいいのでしょうか?教えてください。 あと、できれば3次元配列はそのまま使いたいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • ency
  • ベストアンサー率39% (93/238)
回答No.3

以下のようにすれば、キャストの必要なしにできますよ。 void sort( char (*CASL)[N][N], char *read ); 配列はその先頭要素を指すポインタに読み替えられるのがご存知だと思います。 たとえば、char hoge[N] を関数の引数に渡そうとした場合 void func1( char *p_hoge ); とすれば良いわけですね。 要するに、これと同じように考えれば良いわけです。 char piyo[L][M][N] (「『char型の配列(要素数N)』の配列(要素数M)」の配列(要素数L)) を関数の引数に渡そうとした場合、 void func2( char (*p_piyo)[M][N] ); とすれば良いわけです。 char (*p_piyo)[M][N] は「『char型の配列(要素数N)』の配列(要素数M)」を指すポインタですが、どうしてこれで良いのかは、ご自分で考えてみてください。 ちなみに、func2() の中では p_piyo[i][j][k] というような使い方ができるんですよ。 同様に、sort() の中でも CASL[i][j][k] とか、read[n] といった使い方ができます。 *(read + n) とかって、見にくくないですか? 私の場合、read[n] の方が見やすいのでこうしています。 とりあえず、ご参考まで。。。

その他の回答 (2)

回答No.2

CASLの型が違うからです。 main() で CASL と書いてもそれの型は char * ではありません。char (*)[N][N][N] です。なので char * にキャストしてしまうか、または sort() の方を改造する必要があります。キャストする場合は sort() を呼ぶ個所を sort((char *) CASL, read); のように書き換えればできます。キャストしないで型をそのまま使う場合は sort() の方を void sort(char CASL[N][N][N],char *read) に変更し (プロトタイプ宣言もこれに合わせて変えて)、 sort() 内部で *(CASL+i*N*N+j*N+k) のようにアクセスするのをやめて CASL[i][j][k] でアクセスするようにします。

jon-td-deen
質問者

お礼

ありがとうございます。キャストしたらできました。ほんとに助かりましたありがとうございます。

回答No.1

char sort(char*,char*); void sort(char *CASL,char *read) プロトタイプ宣言と関数本体の宣言で型が違います。 エラーはこちらではないでしょうか。 引数の引渡しでもWarningくらいは出ると思いますが・・・。 それを取りたい時は、引数を渡す時に型のキャストを行ってください。

関連するQ&A