• ベストアンサー

コンパイルエラーについて

#include <stdio.h> int main(void){ char a[8],b[7],c[6]; printf("a[8]のアドレスは%pです。\n",&a[8]); //a[8]のメモリアドレスを表示 printf("\n"); printf("b[7]のアドレスは%pです。\n",&b[7]); //b[7]のメモリアドレスを表示 printf("\n"); printf("c[6]のアドレスは%pです。\n",&c[6]); //c[6]のメモリアドレスを表示 printf("\n"); char *c1 ="abcde"; printf("c1=%s\n",c1); //abcdeを表示 printf("c1[2]=%c\n",*(c1+2)); //先頭アドレスの2つ先のアドレスに格納されている値(c)を表示 char c2[] ="abcde"; char *pc2; printf("c2=%s\n",c2); //abcdeを表示 pc2=&c2[2]; //変数c2[2]のアドレスを格納 printf("c2[2]=%c\n",*pc2); //c2[2]アドレスに格納されている値(c)を表示 char *c="abcdefghijklmn"; char cc[]="opqrstuvwxyz"; printf("%c\n", *(c+7)); printf("%c\n", *(cc+2)); return 0; } としてコンパイルした所、 test.c: In function ‘main’: test.c:31: error: conflicting types for ‘c’ test.c:4: note: previous declaration of ‘c’ was here と出てしまいました。原因が良く分からないのですが教えて頂けますでしょうか?

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

  • ベストアンサー
  • asuncion
  • ベストアンサー率33% (2126/6286)
回答No.1

>char a[8],b[7],c[6]; >char *c="abcdefghijklmn"; 変数cをダブって定義しようとしているためです。 >test.c:4: note: previous declaration of ‘c’ was here test.cの4行目 注記:前に定義したcがここにありますよ って書いてます。 コンパイルエラーの読み方を学びましょう。

nardobrea
質問者

お礼

偶然出会ったサイトに、そのように書いてありました。 かなり単純でしたね。今度からは気を付けたいと思います。 ありがとうございました

その他の回答 (4)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

や, 規格に従った処理系である限り char a[8]; に対して &a[8] は OK です>#4. これは自動的に a+8 と解釈され, 意味のある値であることが保証されています. もちろん &a[9] や &a[-1] はアウト.

nardobrea
質問者

お礼

ありがとうございました。おかげでスムーズに動きました。

  • Hardking
  • ベストアンサー率45% (73/160)
回答No.4

単純に変数cが二重定義ということでしょう。 4行目で、文字配列と定義し、31行目でポインター変数として定義 している為。 31行目のポインター変数名を変えればOK。 後、下記はNGです。 printf("a[8]のアドレスは%pです。\n",&a[8]); //a[8]のメモリアドレスを表示 printf("b[7]のアドレスは%pです。\n",&b[7]); //b[7]のメモリアドレスを表示 printf("c[6]のアドレスは%pです。\n",&c[6]); //c[6]のメモリアドレスを表示 文字配列変数aの添え字は0~7 文字配列変数bの添え字は0~6 文字配列変数cの添え字は0~5 なので定義を変える。 char a[9], b[8], c[7]; またはprintf文を変えなければならないです。 printf("a[7]のアドレスは%pです。\n",&a[7]); //a[7]のメモリアドレスを表示 printf("b[6]のアドレスは%pです。\n",&b[6]); //b[6]のメモリアドレスを表示 printf("c[5]のアドレスは%pです。\n",&c[5]); //c[5]のメモリアドレスを表示

nardobrea
質問者

お礼

他の至らない点まで指摘して頂きありがとうございました。

  • BellBell
  • ベストアンサー率54% (327/598)
回答No.3

test.c:31: error: conflicting types for ‘c’ test.c:4: note: previous declaration of ‘c’ was here 翻訳すると、 test.cの中で31行目に書かれてるcって名前は衝突してるぜ、オィ!! test.cの中で4行目に、既にcって名前使ってるよな、オラァ!! ってところでしょう。

nardobrea
質問者

お礼

>>test.cの中で31行目に書かれてるcって名前は衝突してるぜ、オィ!! >>test.cの中で4行目に、既にcって名前使ってるよな、オラァ!! ってところでした。ありがとうございました。

  • anicicle
  • ベストアンサー率36% (129/356)
回答No.2

ざっと見た感じだと、 >char a[8],b[7],c[6]; と >char *c="abcdefghijklmn"; が多重定義扱いになるんじゃないかな? それと、利用しているコンパイラによっては変数宣言は全て関数の最初に記載しないといけないものもあるので注意。

nardobrea
質問者

お礼

偶然出会ったサイトに、そのように書いてありました。 かなり単純でしたね。今度からは気を付けたいと思います。 ありがとうございました >>それと、利用しているコンパイラによっては変数宣言は全て関数の最初に記載しないといけないものもあるので注意。 そんなのもあるんですね。勉強になりましたありがとうございました。

関連するQ&A

  • c言語の配列の先頭アドレスが偶数アドレスとなる理由について

    c言語の配列の先頭アドレスが偶数アドレスとなる理由について 下記のように実行結果をで見ると、配列Sの先頭アドレスと配列Cの先頭アドレス共に偶数アドレスなる理由を教えて頂きたい。 /*list0105*/ #include <stdio.h> main() { char na=1; char nb=1; char c[2] ={1,2}; char s[3] = {1,2,3}; char nc=1; char nd=1; printf("%p\n",&na); printf("%p\n",&nb); printf("%p %p \n", &c[0],&c[1] ); printf("%p %p %p \n", &s[0],&s[1] ,&s[2] ); printf("%p\n",&nc); printf("%p\n",&nd); } 実行結果 0xbffff8cf 0xbffff8ce 0xbffff8cc 0xbffff8cd ← c配列 0xbffff8b0 0xbffff8b1 0xbffff8b2 ← S配列 0xbffff8af 0xbffff8ae

  • 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言語を独学で始めたばかりの者です。 ポインタのところまでいきましたが、以下のプログラムを配列で書き替えようと思ったのですが、test4ができません。test1から3 までは配列を使って書けました。 #include <stdio.h> main() { char s[10]; char *p; strcpy(s, "ABCDE"); p=s; printf("------test1\n"); printf("s=%s p=%s\n", s, p); printf("------test2\n"); putchar(*p); putchar(*(p+1)); putchar(*(p+2)); putchar('\n'); printf("------test3\n"); *p='m'; *(p+1)='n'; printf("s=%s\n", s); printf("------test4\n"); while(*p) { *p=*p+1; ++p; } printf("s=%s\n", s); } この最後のtest4を配列で書くとどうなるのでしょうか。質問文が長くて申し訳ないのですが、お願いいたします。

  • 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); 上記の通りエラーメッセージが出ます。 どうしたらいいでしょうか? ご回答の程宜しくお願い申し上げます。

  • コンパイルエラーについて

    次のようなプログラムをうつと以下のようなコンパイルエラーが表示されます。 main(){ int a[2][3]; struct monster monster[5] = { { 1, "a", "b", 1, 2, 120, 80, "v", 60, 60, 60, 100}, { 2, "a", "b", 2, 3, 120, 80, "w", 60, 60, 60, 100}, { 3, "a", "b", 3, 4, 120, 80, "x", 60, 60, 60, 100}, { 4, "a", "b", 4, 5, 120, 80, "y", 60, 60, 60, 100}, { 5, "a", "b", 5, 1, 120, 80, "z", 60, 60, 60, 100}, }; struct monster monster2[5] = { { 1, "a", "b", 1, 2, 120, 80, "v", 60, 60, 60, 100}, { 2, "a", "b", 2, 3, 120, 80, "w", 60, 60, 60, 100}, { 3, "a", "b", 3, 4, 120, 80, "x", 60, 60, 60, 100}, { 4, "a", "b", 4, 5, 120, 80, "y", 60, 60, 60, 100}, { 5, "a", "b", 5, 1, 120, 80, "z", 60, 60, 60, 100}, }; inputmonster(a, monster); printf("これからバトルを開始します\n\n"); printf("player1は%sをくりだした。\n", monster[a[0][0]-1].name); printf("player2は%sをくりだした。\n", monster2[a[1][0]-1].name); battle(a, monster, monster2); return 0; } void inputmonster(int x[][3], struct monster monster[]) { int i, s, t, m, n; for(t = 0; t < 2; t++){ s = 0; while (s < 1){ printf("player%dは好きなモンスターを3つ選んでください\n\n", t+1); for (i = 0; i<3; i++){ printf("%d体目を選んでください。\n\n", i+1); for(m = 0; m < 5; m++) printf("%d, %s\n", m+1, monster[m].name); scanf("%d", &x[t][i]); printf("%d体目 : %s\n\n", i+1, monster[x[t][i] - 1].name); } printf("これでよろしいですか?\n"); for(i = 0; i<3; i++) printf("%d体目 : %s ", i+1, monster[x[t][i] - 1].name); printf("1、はい 2、いいえ\n"); scanf("%d", &n); if(n == 1) s = 1; else s = 0; } } } monsterbattle.c: 関数 ‘main’ 内: monsterbattle.c:499:15: 警告: 互換性のないポインタ型から 1 番目の ‘inputmonster’ の引数に渡しています inputmonster(&a, monster); ^ monsterbattle.c:27:6: 備考: expected ‘int * (*)[3]’ but argument is of type ‘int (*)[2][3]’ void inputmonster(int *x[][3], struct monster monster[]) ^ monsterbattle.c:507:9: 警告: 互換性のないポインタ型から 1 番目の ‘battle’ の引数に渡しています battle(a, monster, monster2); ^ monsterbattle.c:232:6: 備考: expected ‘int *’ but argument is of type ‘int (*)[3]’ void battle(int a[2], struct monster monster[], struct monster monster2[]) ^ すいませんが、あまりエラーの詳細がわからず困っています。 どこをどのように変更すべき表示なのでしょうか? よえろしくお願いします。

  • 何故かエラーOSXで

    int main() { int a=15, b=20; printf ("a=15?n b=20?n"); printf ("a+b=%d?n",a+b); printf ("NANIKAkeyWOOSITE"?n"); getch(); printf("end"); return 0; } 猫でもわかるプログラミングを参考にして書いたんですが 何故かエラーがでます OSXではできないのでしょうか? エラー内容は test.c:2:19: error: conio.h: No such file or directory test.c: In function 'main': test.c:10: error: stray '?' in program test.c:10: error: parse error before "n" test.c:10: error: missing terminating " character です ソースも間違ってないはずです  どなたか教えて下さい!

  • C++ ポインタ 認識はこれでただしいですか?

    int i=3;// iが格納されてるアドレスは001とする そこに3の値 int *pi;// piが格納されているアドレスは//002とする pi=&i;// アドレス002にある値に001が入る printf("%p",pi);//001が表示 printf("%d",*pi);//アドレス001を参照して3を表示 printf("%p",&pi);//002が表示 Q1 このイメージであってますか? Q2 *pi= の右辺は&i,iなどいれられない   代入するときは宣言以外のときは   pi=&i のようにpi= という形にして右辺はアドレスをいれ なければならない。  これであってますか? Q3 char *pc; pc="ABCDE";//ABCDEは文字定数領域に記憶される //文字Aがアドレス(仮)005、Bが006にはいっていたとしたら ↑の式はpc=005;という意味でアドレスを代入している これでいいでしょうか?

  • C言語

    以下のプログラミングについて。 #include<stdio.h> int main(void) { char ss[6]="ABCDE"; printf("ss[0]=%c\n",ss[0]); printf("ss[1]=%c\n",ss[1]); printf("ss[2]=%c\n",ss[2]); printf("ss[3]=%c\n",ss[3]); printf("ss[4]=%c\n",ss[4]); printf("ss[5]=%c\n",ss[5]); printf("ss=%c\n",ss); return 0; } 以上のプログラミングの出力は、 ss[0]=A ss[1]=B ss[2]=C ss[3]=D ss[4]=E ss=ABCDE となると思うのですが、あってますか? また、 printf("ss[5]=%c\n",ss[5]); は、char文でいうとヌル(ナル)文字の\0の部分に相当すると思うのですが、printf("ss[5]=%c\n",ss[5]);の出力制御はどうなるんですか? ご教授願います。

  • ポインタ?

    #include <stdio.h> main() { char s[] = "I love cat and dog."; char c = 'a'; char *p = s; int n = 0; printf("\"%s\"の中から\'%c\'をさがします。\n", s, c); while(*p != '\0') { if(*p == c) { printf("%d番目で発見しました。\n", p - s + 1); ++n; } ++p; } if(n == 0) { printf("1つも見つかりませんでした。\n"); } else printf("全部で%d個見つかりました。\n", n); return 0; } わからないので質問したいのですが、これは「Cの絵本」という、 本に出ているサンプルプログラムです。 わからないところは、 12行目の、printf("%d番目で発見しました。\n", p - s + 1); ところです。その、「p - s」のところが特にわかりません。 ポインタって言うのは、アドレスを格納する変数ですよね? その、pからsを引いても0になるんじゃないかと思って、理解が できません。どうして、このp-sで、cの位置が発見できるのかが 理解できません。最後の+1は配列が0から始まるんで+1にすれば いいのはわかるんですが、p-sでどんなことが起きているかが 理解できなくて。ポインタをちゃんと理解できていないから、 こういった疑問が出てくるんですかね? ほかの参考書も本屋さんに行って見てみようと思っているんですが、 どなたか教えていただけませんか? よろしくお願いします。

  • コンパイルエラーについて

    関数 y=x と y=x*x/8 のグラフをテキストで描くプログラムなのですが、cygwinでコンパイルすると次のエラーが出ます。何を直せばいいのか教えてください。 /tmp/cceveo7s.o:week2.c:(.text+0x62): undefined reference to `_f' /tmp/cceveo7s.o:week2.c:(.text+0xb1): undefined reference to `_f' /tmp/cceveo7s.o:week2.c:(.text+0xbd): undefined reference to `_g' collect2: ld はステータス 1 で終了しました ソースプログラムはこちらです。 #include <stdio.h> #define XSIZE 20 #define YSIZE 20 char graph[XSIZE][YSIZE]; /* 座標(x, y)に文字cをプロットする */ void f(int x, int y, char c); /* 作成したグラフを表示する */ void g(void); int main(void){ int x, y; for (x=0;x<XSIZE;x++){ y = x; f(x, y, '+'); } for (x=0 ; x < XSIZE ; x++){ y=x*x/8 ; f(x, y, '*'); if(y>=YSIZE) break; g(); return 0; } void f(int x, int y, char c) { graph[x][y] = c; } void g(void) { int a, b; for (b=YSIZE ; b>0 ; b--){ for (a = 0 ; a < XSIZE ; a++){ if (graph[a][b]==0) printf(" "); else printf("%c ", graph[a][b]); } printf("\n"); } } return 0; }

専門家に質問してみよう