• ベストアンサー

C言語でのコンパイルエラー

初心者です。 非常に基本的な質問かもしれませんが、 ご回答いただけたらうれしいです。 void test1(unsigned char* data) { } void test2(unsigned char** data) { } int main(void) { unsigned char data1[6]; unsigned char data2[6][6]; test1(data1); test2(data2); } としてtest1はうまくいくのに、 test2はコンパイルエラーになります。 どっちもポインタになると思うのですが…。 また、unsigned char data2[6][6]を 他の関数の引数とする場合は どうすればよろしいのでしょうか? 宜しくお願いいたします。

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

  • ベストアンサー
  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.2

ポインタ参照と配列参照を混同しているから、エラーの原因が理解出来ないのだと思います。 test1(data1); と書いた場合、これは、 test1(&data1[0]); と書いているのと同じです。同様に test2(data2); と書くと test2(&data2[0][0]); と同じです。 「&data2[0][0]」は「unsigned charへのポインタ(unsigned char *)」ですから、関数の宣言部の「unsigned char **」と一致せず、エラーになります。 なお、関数test2の引数「unsigned char **data」は、unsigned charのポインタへのポインタですので、unsigned charの2次元配列であるdata2は受け取れません。 unsigned charの2次元配列であるdata2を引数に渡す場合は、受け取り関数の引数をunsigned char *にして、関数内で配列要素にアクセスする場合は、自分で要素番号を計算する必要があります。 void test2(unsigned char *data) {   unsigned char c;   c = data[3 * 6 + 1]; /* data2[3][1]にアクセス */ } void main(void) {   unsigned char data2[6][6];   test2(data2); } 1次元配列だろうが2次元配列だろうが3次元配列だろうが、次元数が幾つであっても、配列名のみを書いた時は、「配列要素へのポインタ」つまり「<データ型> *」になると言う事を忘れないで下さい。

win0000
質問者

お礼

ご親切な説明。 非常に解りやすかったです。 意味もわかりました。 ありがとうございました。

その他の回答 (2)

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.3

#2です。 補足です。 最近のCでは#1の回答の書き方も可ですが「古典的なCコンパイラ」では、この書き方を許さない場合があります。なので、#2の回答では「処理系に依存しない、殆どすべてのCコンパイラで許されている書き方」にしています。 まあ、たいていのCコンパイラで#1の回答の書き方で大丈夫だと思いますが。

  • ranx
  • ベストアンサー率24% (357/1463)
回答No.1

void test2(unsigned char data[6][6]) または void test2(unsigned char (*data)[6]) として下さい。

win0000
質問者

お礼

ありがとうございます

関連するQ&A

  • C言語での関数の引数の受け渡しについて

    C言語での関数の引数の受け渡しについて教えてもらいたいのです。 char *p=Goo;  というポインタpがmain関数で定義され、このポインタpをある関数 void func(・・・) に渡すことは出来ますか? つまりポインタを実引数として扱うことはできるのかという事ですが・・・ int p=10; とかだったら、 void func(int test) の関数には、main関数で func(p) で仮引数testにわたせると思うんですが・・・ もし出来るようでしたら、関数の渡し方と定義の記述を教えてください。 どうか宜しくお願いします。

  • C言語、度々すいません。コンパイルエラーです。

    いつも大変お世話になり誠にありがとうございます。 下記コードがコンパイルエラーになり色々と 変えてみたのですが、どうしてもコンパイルエラー となります。 度々すいません。 ご回答の程宜しくお願い申し上げます。      記 1.コード #include <stdio.h> int main(void) { char ch; printf("アルファベットの最初の文字は何ですか?\n"); ch = getchar(); printf("アルファベットの最初の文字は%cです。\n" ch); return 0; } 2.コンパイルエラー C:\MinGW>gcc test8.c -o test8 test8.c: In function 'main': test8.c:9:51: error: expected ')' before 'ch' printf("アルファベットの最初の文字は%cです。\n" ch); 上記の通りエラーメッセージが出ます。 どうしたらいいでしょうか? ご回答の程宜しくお願い申し上げます。

  • 関数へ引数を渡す時・・・(C言語)

    Cを始めたばかりです。 レベルの低い質問だと思いますがお願いします。 【ソース】 /* a1.c */ #include <stdio.h> void aaa(char); int main( int argc, char *argv[] ) { char box[] = "test"; aaa(box); return 0; } /* a2.c */ #include <stdio.h> void aaa(char box) { printf( "%s",box ); } 【質問】 変数boxの中身を関数aaaに渡したいだけですが、 上記ソースをコンパイルすると、a1.cの aaa(box) の部分でエラーが出てしまいます。 どうもデータ型(ポインタ?)がまずいようですが、 何が問題なのでしょうか? 御回答宜しくお願い致します。

  • こんなコンパイルエラーがでます。

    OS:WinNT4.0 環境:VC++6.0 MFC コンパイル時に次のエラーが出て来ました。 error C2664: 'qsort' : 4 番目の引数を 'int (const void *,const void *)' から 'int (__cdecl *)(const void *,const void *)' に変換できません。 (新しい機能 ; ヘルプを参照)スコープ内でこの名前を持つ関数でターゲット型に一致するものはありません。 qsort関数の引数関数を'int xxxxxxx(const void *,const void *)に宣言したところこのエラーが出てきました。 何がなんだかさっぱりわかりません。 ぜひお願いします。

  • c言語

    (c++ではなくC89準拠) c言語について質問 (1) 関数名()と関数名(void)は違う意味 (2) mainの引数の型は(void)か(int argc, char *argv[]) (3) K&Rは標準c準拠でmain()という表記があります ということは、(1)の関数名とはmain以外の関数名で、 main()とmain(void)は同じなんでしょうか。

  • C言語 どこがコンパイルエラーか解りません。

    いつも大変お世話になっております。 標記の件。 どこがエラーなのか解りません。 2時間くらい、にらめっこが続いています。 どこがエラーなのか教えて下さい。 ご回答のほどよろしくお願い申し上げます。 コード #include <stdio.h> int a = 0; void func(void) { int c = 2; printf("func関数では変数aとcが使えます。¥n”); printf("変数aの値は%dです。\n",a); /*printf("変数bの値は%dです。\n",b);*/ printf("変数cの値は%dです。\n",c); } int main(void) { int b = 1; printf("main関数では変数aとbが使えます。\n"); printf("変数aの値は%dです。\n", a); printf("変数bの値は%dです。\n", b); /*printf("変数cの値は%dです。\n", c); */ func(); return 0; } コンパイルエラー printf("func関数では変数aとcが使えます。¥n”); ^ text10.c:9:8: error: missing terminating " character printf("func関数では変数aとcが使えます。¥n”); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ text10.c:10:34: error: expected ')' before ';' token printf("変数aの値は%dです。\n",a); ^ text10.c:10:1: warning: passing argument 1 of 'printf' makes pointer from integer without a cast [-Wint-conversion] printf("変数aの値は%dです。\n",a); ^~~~~~ In file included from text10.c:1:0: c:\mingw\include\stdio.h:454:38: note: expected 'const char *' but argument is of type 'int' _CRTIMP __cdecl __MINGW_NOTHROW int printf (const char *, ...); ^~~~~~ text10.c:13:1: error: expected ';' before '}' token } どうかよろしくお願いいたします。

  • C言語 コンパイルエラー(文字列または文字定数が閉じていない)

    下記コードでコンパイルすると、コンパイルエラーとなります。試しに、"さようなら"を、"さような"に変更すると、コンパイルエラーは なくなります。どうして、コンパイルエラーとなるのか分からずに困っています。ちなみに、コンパイラは、ボーランドのものを使っています。 ▼エラーとなるコード #include <stdio.h> int main(void) { printf("こんにちは"); printf("さようなら"); return 0; } ▼コンパイルエラー内容 エラー E2380 sample08.c 7: 文字列または文字定数が閉じていない(関数 main ) エラー E2121 sample08.c 9: 関数呼び出しに ) がない(関数 main ) 警告 W8070 sample08.c 10: 関数は値を返すべき(関数 main )

  • 2次元配列とポインタの引数受け渡しについて

    2次元配列を関数に渡すときは、引数に渡す2次元配列と同じサイズを指定、もしくは2次元目のサイズのみ合わせて渡す方法がありますが、両方とも違うサイズで同じ関数を使いたいです。 最初は中身が同じで引数で受け取る2次元配列のサイズだけ、それぞれに合わせた引数を持つ関数を2つ作っていたのですが、なんだか冗長な気がしました。 そこで、2次元配列の先頭ポインタとサイズを受け取るようにすればいいのかと思い、テストとして次のプログラムを作成してみました。 #include <stdio.h> void func(unsigned char *a, int y, int x); int main(void) { unsigned char a[10][10]; func(a, 10, 10); printf("%d\n", a[7][4]); return 0; } void func(unsigned char *a, int y, int x) { int i, j; for (i = 0; i < y; i++) { for (j = 0; j < x; j++) { *(a + i*y + j) = i * j; } } } もちろんこれでも動くのですが、やはりこういう書き方はルールにはないので、コンパイルで警告が出ます。 a.c: In function ‘main’: a.c:10: warning: passing argument 1 of ‘func’ from incompatible pointer type a.c:4: note: expected ‘unsigned char *’ but argument is of type ‘unsigned char (*)[10]’ このような書き方はやはりやめたいいのでしょうか。 また、その際はサイズ別に関数を作るしかないのでしょうか。 他にいい方法があれば教えていただけると助かります。

  • C言語のreturnの使い方

    return a, b; のように2つの引数で値を返せることを最近になり 知りました。ところで以下のような使い方は可能でしょうか? test( , )という2つの引数が必要な関数にnum()で return 1,2としてひとつの関数呼び出しで引数2個分に すると言うようなことです。 #include <stdio.h> int test( int i, int j){   printf("%d %d",i,j); } int num(void){   return 1,2; } int main(void){   test( num() ); }

  • 【C言語】 コンパイルエラーが解決できません

    参考書でC言語学習中の初心者です。 参考書記載のサンプルコードをコンパイルするとエラーになります。 誤字脱字は何度も確認しています。google等でも調べましたがわかりませんでした。。。 どなたか、どこが間違っているのかご教示いただけませんでしょうか。 また、何か的外れな記載があればご指摘いただけますでしょうか。 【環境】 OS: Mac OS X 10.9.3 コンパイラ:Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn) 【サンプルコード】  ------------------------------------------------- #include<stdio.h> int main(void){ int data; data = 10; printf("変数dataの値 = %d\n", data); printf("変数dataのアドレス = %08X", &data); return 0; } ------------------------------------------------- 【エラー】 破線内 ------------------------------------------------- sample12-1.c:9:45: warning: format specifies type 'unsigned int' but the argument has type 'int *' [-Wformat] printf("変数dataのアドレス = %08X", &data);                     ~~~~ ^~~~~ 1 warning generated. ------------------------------------------------- 宜しくお願い申し上げます。

専門家に質問してみよう