• ベストアンサー

C言語のコンパイル後のエラ-

UNIX windows98でC言語をプログラムしました。 #include<stdio.h> void main() { int val; val=5; printf("今、変数の中身は、 %dです¥n”, val); val=val+1; printf(”今、変数の中身は、 %dです¥n", val);  val=val++; printf("今、変数の中身は、 %dです¥n”,  val); } をファイル名 aaaとして gcc aaa.c でコンパイルしたところ、 aaa.c: In function 'main': aaa.c:5:warning: return type of 'main' is not 'int' とエラ-が現れます。 return(o);を最後に追加するのでしょうか。もし、そうならば、どこに追加する のか、教えてください。   

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

  • ベストアンサー
回答No.1

標準のCでは、main は int型の関数であると定められています。 main が返す値が、そのプログラム自身が返す値として使えるよう にするためです。 Cのテキストのいくつかは、main を void で宣言したり、教師もそ れに沿ってそのまま教えてしまうことがありますが、正確には誤り です。コンパイル時の warning (エラーではない)はそれを警告 しています。warning は場合によっては無視しても正しく動きます が、それが原因で動かないこともあるので、極力修正しましょう。 結論は、main を int と宣言し、最後は 0 を return しておきましょう。 ちなみに return 文は、後に式が続くだけなので、return (0); の ようにしなくても、return 0; で十分です。

bobobobo
質問者

お礼

お答えありがとうございます。 コンパイルは成功しました。

その他の回答 (2)

  • coolguys
  • ベストアンサー率18% (351/1917)
回答No.3

戻り値が設定されていないというワーニングですね。 void型は戻り値がないわけではないので、 書いておくのが妥当です。 やっぱり、コンパイルかけたときに エラーもワーニングもないと気分がいいじゃないですか。

参考URL:
http://www.kumei.ne.jp/c_lang/
bobobobo
質問者

お礼

お答えして頂き、有難うございます。

  • hero1000
  • ベストアンサー率29% (114/390)
回答No.2

エラーではなくワーニングですから、そのままにしておいても特に問題は ありませんが一応・・・。 このワーニングは「main関数の戻り値型がintではない」というものです。 main関数は本来、プログラムが正常に終わったかどうかをint型で返す事に なっているため、boboboboさんの「void main()」という記述が引っかかっ てしまったわけです。 ですから「void main()」を「int main()」に直し、最後の「}」の直前の 行に「return(0);」を書けばワーニングはなくなるはずです。

bobobobo
質問者

お礼

お答え有難うございます。早速、アドバイス通りに書き換えると、 コンパイルは上手くできました。 

関連するQ&A

  • c言語のプログラムの実行

    #include<stdio.h> int main() { int val; val=5; printf("今、変数の中身は、%dです\n", val); val=val+1; printf("今、変数の中身は、 %dです\n", val); val=val++; printf("今、変数の中身は、 %dです\n", val); return 0; } をファイル名 aaa  として、 %  gcc  aaa.c  で無事コンパイルできましたが、いざ実行しようと % ./aaa    Enter とすると ./aaa.out:コマンドが見つかりません.  となります。 また 別に %  ./aaa.out Enter としても上と同様な結果になります。 ぜひ、お答えを頂きたいです。     この時は unixとwindows98を使用しています。  

  • 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言語ですが、.hに実装を書くのは避けたほうが良いといわれます。 私は main.c define.h aaa.h bbb.h みたいなスタイルでコードを書いていました。 まずdefine.hでグローバル変数や、マクロなどの宣言を まとめて行い、ほかの.hやmain.cでも使えるようにして いました。 しかし、以下のような状況のとき、どのように分割すれば 良いのかが分かりません・・・。 たとえば、以下のように、マクロNUM、変数a,bをすべてのファイルで共有して使えるように分割コンパイルするにはどのようにコードを書き直せば良いのでしょうか? //--------------main.c------------------ #include "define.h" #include "aaa.h" #include "bbb.h" int main( void ){   printf("%d", a);   printf("%d", b);   printf("%d", NUM);   aaa();   bbb();   return 0; } //------------define.h------------------ #define NUM 100 int a = 10; int b = 20; void aaa( void ); void bbb( void ); //------------aaa.h------------------ void aaa( void ){   printf("%d", a);   printf("%d", b);   printf("%d", NUM); } //------------bbb.h------------------ void bbb( void ){   printf("%d", a);   printf("%d", b);   printf("%d", NUM); }

  • C言語のポインタについて教えてください。

    C言語のポインタについて教えてください。 ・pointer1.c  int main(){   int a;   int *p;   p = &a;     a = 123;   printf("%d", *p);   return 0;  } ・pointer2.c   int main(){ int a[100]; int *p; p = &a[0]; int i; for(i = 0; i < 100; i++) a[i] = i; for(i = 0; i < 100; i++) printf("%d", *p++); return 0; } と二つのソースコードがあるとき、pointer2.cの「p = &a[0]」をpointer1.cのように「p = &a」と書けないのはなぜですか?  また、「&a」は動かすことのできなく、「aを指し示す*p」は動かすことができる変数のようなもの、という認識に誤りはないでしょうか?  宜しくお願いします。

  • C言語<素数を求めるプログラム>

    #include<stdio.h> int j; int prime(int n) { int i; if(n < 2) return 0; if(n == 2) return 1; if(n%2 == 0) return 0; for(i = 3; i*i<= n; i += 2){ if(n%i == 0) return 0; } return 1; } int main(void) { int n; for(n=1; n <= 1000; n++) { if(prime(n)){ printf("%d\n",n); j++; } } printf("素数の個数は全部で %d 件見つかりました。\n",j); return 0; } このプログラムは1から1000までの素数のみを表示させるプログラムでありますが、このアルゴリズムが全くわかりません。 int prime(int n)の中身のアルゴリズムがどういう仕組みになっているのかお分かりになりますでしょうか?

  • C言語

    以下のようなhello.cがあります。 include<stdio.h> int main(void) { printf("Hello World! \n"); return 0; } gcc -E hello.c と打つとプリプロセッサが表示されます。 課題はこの中からprintfに関するものを見つけ、読み取れることを説明せよとのことです。 問題の意図と解き方がわかりません。 よろしくお願いします。 環境はwsl ubuntu です。

  • C言語で分からないところがあるのですが……

    C言語で分からないところがあるのですが…… すみません。C言語の課題で分からないところがあり、質問しに来ました。 ユーザから数を受けて、そこまでのフィボナッチ数列を表示させるというプログラムです。 下のソースコード(でいいんですよね?)は正しいやつです。 for文を使って、繰り返しの作業を行うことに成功しましたが、doとwhileに書き換える作業がうまくできません。 どなたか助けてください。 #include<stdio.h> fib(int n) { if(n == 1)return(1); else{ if(n == 2) return (1); else return fib(n-1) + fib(n-2); } } main() { int n, i ; printf("INPUT the number. : "); scanf("%d",&n); for(i=1; i<=n; i++){ printf("F%d = %d\n",i, fib(i)); } }

  • C言語について

    次のような問題です。 問 自然数nを入力し、nを3で割って割り切れるかどうかを判定し結果を表示する。「割り切れる」、「1余る」、「「2余る」のいずれかが入るものとする。 このようなものをつくりました。 #include<stdio.h> int main(void) { int n; printf("自然数:"); scanf("%d",&n); if(n==0){ printf("割り切れる\n"); }else if(n==1){ printf("1余る\n"); }else{ printf("2余る"); } return(0); } これで合っているかよろしくお願いします。

  • C言語。どうしてコンパイルできません^^;

    最近プログラミングの勉強をはじめました。 C言語を勉強しています。 /*入力した値の、平均値・最大値・最小値・を出す。*/ #include <stdio.h> int main(void) { int x[5],i,j,w,x,y,z,sum; printf("5つの実数の平均、最大値、最小値を求めます\n"); sum = 0; for(i=0; i<5; i++){ printf("値%d:",i+1); scanf("%d",&x[i]); sum += x[i]; } for(y=0; y<5; y++){ for(j=0; j<4; j++){ w=j+1; if(x[j] < x[w]){ z = x[i]; x[i] = x[w]; x[w] = z; } } } printf("平均値:%f\n最大値:%d\n最小値:%d\n", (double)sum/5, x[0], x[4]); return 0; } Microsoft Visual C++ 2008 Express Edition でコンパイルをしようとしたのですが、 「error C2040: 'x' : 'int' は 'int [5]' と間接操作のレベルが異なります。」 と出てできませんでした^^; 何度も見直したのですが、どうしても間違っている場所がわかりません^^; どこがいけないのでしょうか^^;

  • C言語

    以下の出力結果はどうなりますか? 教えてください。 #include <stdio.h> #include <stdib.h> int main (void){ int n,f; n=792; f=2; while(f*f<=n){ while(n%f==0){ printf("%d",f); n=n/f; } f++; } if(n !=1) printf("%d",n); printf("\n"); return 0; }

専門家に質問してみよう