• 締切済み

間違いが存在するみたいなんですが・・・

以下のプログラム、 間違いが存在するみたいなんですが、 MicrosoftVisualC++ でコンパイルしてみても エラー、警告ともに0でちゃんと実行できました。 本当に間違いが存在するでしょうか? #include <stdio.h> int Testfunc(int InputData) { int Ret; if(InputData<100){ Ret=InputData*2; } retrun Ret; } void main() { int InputData; int OutputData; printf("整数入力"); scanf("%d", &InputData); OutputData=Testfunc(InputData); printf("%d\n", OutputData); }

みんなの回答

  • TT414
  • ベストアンサー率18% (72/384)
回答No.8

ANo.3 >> main関数の戻り値はvoidのままでOKだと聞いていたので、 >そういう嘘を信じてはいけません。 >int main(void), int main(int argc, char *argv[])のいずれかでなければなりません。 JIS-Cから引用ここから Page 8(途中省略してあります) 5.1.2.2.1 プログラムの...次の4種類の方法のいずれかで定義しなければならない。 - int main ( void ) { } - int main ( int, char *[] ) { } - 上2つと等価な方法 - 上3つの方法のいずれでもない処理系定義の方法 Page 9(途中省略してあります) 5.1.2.2.3 main関数の返却値の型がintと適合しない場合、ホスト環境に戻される終了状態は、未規定とする。 Page 3 3.4.4 未規定の動作 この規格が、二つ以上の可能性を提供し、個々の場合にどの可能性を選択するかに関して何ら要求を課さない動作。     例 未規定の動作の例としては、関数の実引数の評価順序がある。 ここまで これを読むとvoid main()と書くのは、規格内です。 ANo.4を嘘つき呼ばわりする根拠を教えてください。

全文を見る
すると、全ての回答が全文表示されます。
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.7

話がどんどん違う方向に進んでいるので(私にも原因がありますが)、改めて質問に直接関係する話題に戻ります。 InputDataが100以上のとき、Testfuncの返却値が未規定になるのはすでに指摘されているとおりです。そして、それを間違いだとするのであれば、scanfでint型の表現範囲を超える数値を入力された場合の動作は未定義ですので、こちらの方がむしろ深刻です。 ところで、JIS-CというかJIS X3010にはいくつかのバージョンがあります。mainの返却値がintでなくても許されるようになったのはJIS X3010:2003からで、これはISO/IEC 9899:1999(通称C99)に対応します。以前のJIS-C、例えばJIS X3010:1997などでは、mainの返却値はint型でなければなりませんでした。ただし、それはホスト環境の場合の話であって、(組込み機器のような)OSの支援を受けないフリースタンディング環境の場合は何でもOKで、プログラムがmain関数から始まる必要すらありません。

全文を見る
すると、全ての回答が全文表示されます。
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.6

main関数の型についてですが、(非標準処理系である)Microsoft Visual C++に限れば、 http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/vclang/html/_pluslang_program_startup.3a_.the_main_function.asp の最後にもあるように、返却値型はvoidであっても構いません。 また、 http://www.bohyoh.com/CandCPP/FAQ/FAQ00014.html が参考になるかと思いますが、C99やC++であれば、移植性さえ捨てる気なら処理系によっては独自の型で宣言することが認められています。

全文を見る
すると、全ての回答が全文表示されます。
  • mac_res
  • ベストアンサー率36% (568/1571)
回答No.5

> main関数の戻り値はvoidのままでOKだと聞いていたので、 そういう嘘を信じてはいけません。 int main(void), int main(int argc, char *argv[])のいずれかでなければなりません。 void main()では、OSに返す戻り値が不定となります。

全文を見る
すると、全ての回答が全文表示されます。
  • TT414
  • ベストアンサー率18% (72/384)
回答No.4

>main関数の戻り値はvoidのままでOKだと聞いていたので、 OKですよ。 No.3の >void main()は誤りです。int main(void)としてください。 は違います、JIS-C以前の規格では規格外かもしれませんが、JIS-Cでは規格内です。

全文を見る
すると、全ての回答が全文表示されます。
  • mac_res
  • ベストアンサー率36% (568/1571)
回答No.3

retrun Ret;は写し間違いですね。コンパイルエラーになります。 Testfunc()はInputDataが100以上のとき、不定の値を返します。 void main()は誤りです。int main(void)としてください。 すると、main()の戻り値が必要になりますので、 return 0; を付け加えます。 以上まとめて、 #include <stdio.h> int Testfunc(int InputData) { int Ret; if (InputData < 100) { Ret = InputData * 2; } else Ret = InputData; return Ret; } int main(void) { int InputData; int OutputData; printf("整数入力"); scanf("%d", &InputData); OutputData = Testfunc(InputData); printf("%d\n", OutputData); return 0; }

toubousha
質問者

お礼

main関数の戻り値はvoidのままでOKだと聞いていたので、 Testfunc()関数の方で InputData>=100 の処理を追加してやればいいというこですね。 有難うございました。

全文を見る
すると、全ての回答が全文表示されます。
  • okg00
  • ベストアンサー率39% (1322/3338)
回答No.2

InputDataが100以上の時はどうなりますか? Retを初期化していないので値が不定になり、Testfuncの戻り値が不定に。

toubousha
質問者

お礼

gccではwarningがでるので これですっきりしました。 有難うございました。

全文を見る
すると、全ての回答が全文表示されます。
  • venzou
  • ベストアンサー率71% (311/435)
回答No.1

何を基準に間違っていると言われているのかが分かりませんが・・ 気になる点を挙げると、 Testfunc() に 100以上の数値を渡すと、戻り値が不定。

toubousha
質問者

お礼

ナルホド、そうですね。 有難うございます。

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

関連するQ&A

  • 構造体について

    5件のデータをRECORDに追加したいのですが、 RECORD inputdata(void)の宣言文エラーなどのコンパイルエラー。それと、inputdataを用いてどうやって5件のデータを入れたらいいかがわかりません。教えてください。 #define SIZE 5 #include <stdio.h> typedef struct{ int yy; int mm; int dd; }YMD; typedef struct{ char name[20]; YMD birthday; int age; }RECORD; RECORD inputdata(void); void main(void) { int i; for(i = 0;i < SIZE;i++){ inputdata(); } RECORD inputdata(void) { RECORD person; printf("名前>"); scanf("%s", person.name); printf("誕生日入力\n"); printf("年>"); scanf("%d", person.birthday.yy); printf("月>"); scanf("%d", person.birthday.mm); printf("日>"); scanf("%d", person.birthday.dd); return person; }

  • コンパイルエラー

    コンパイルしても、12行目(printf("%d番目の整数を入力してください。"i+1);が、関数呼び出しに)がないとでます。でもどこが間違っているか分かりません。 教えてください。お願いします。 #include <stdio.h> int main(void) { int num; int sum=0; int i; for(i=0; i<10; i++){ printf("%d番目の整数を入力してください。"i+1); scanf("%d", &num); sum+=num; } printf("合計は、%dです。\n", sum); return(0); }

  • C言語でscanf()が先に実行されるのはなぜですか?

    C言語でscanf()が先に実行されるのはなぜですか? #include <stdio.h> int main(void){ int intNum; printf("整数を入力してください:\n"); scanf("%d", &intNum); printf("入力値は:%d\n",intNum); return(0); }

  • c言語超初心者です。教えてください

    基本的だと思いますが教えてください。 #include <stdio.h> int main(void) { int na, nb: puts("二つの整数を入力してください."); printf("整数A:”); scanf("%d",&na); printf("整数B:”); scanf("%d",&nb); printf("それらの平均は%fです。\n,(na+nb)/2.0); return(0); } これでintの形で最後のprintfが%fなのですがintは%dとなるはずなのですがこれは2。0という実数値で割るから答えは実数値になりますよ。という意味で%fとしたのでしょうか?確かにこうしないと正しい値がでてこないのです。教えてください。

  • ヒントをください!

    ある課題があるんですが、 「ユーザに好きな整数を10個入力させ、その最小値と最大値を出力するプログラムを書いてください。if文を使ってください。」 このプログラムを作る際のヒントをください。ぜんぜんわからないので。。。 答えは作ってから見たいので。。。 よろしくおねがいします。 10個数字を入力させるプログラムは作りました。 #include <stdio.h> int main(void){ int c,e,r,u,t,v,d,a,p,n; printf("好きな整数を10個入力してください。\n"); printf("整数を入力:"); scanf("%d",&c); printf("整数を入力:"); scanf("%d",&e); printf("整数を入力:"); scanf("%d",&r); printf("整数を入力:"); scanf("%d",&u); printf("整数を入力:"); scanf("%d",&t); printf("整数を入力:"); scanf("%d",&v); printf("整数を入力:"); scanf("%d",&d); printf("整数を入力:"); scanf("%d",&a); printf("整数を入力:"); scanf("%d",&p); printf("整数を入力:"); scanf("%d",&n); return 0; } このようになりました。

  • メソッド制御に関して

    C++初心者です。 メソッドのタスク制御??を行いたいのですが、 いまいちよくわかりません。 やりたいことは、下記のソース(検討違いかと思いますが..)のように、 メソッドをリストにして、ループで処理をさせたいというものです。 下記を説明致しますと、TestFunc1()・TestFunc2()というメソッドがあります これらのメソッドをリスト化(programList)して、 メソッド呼び出し元(main)にて、ループをさせてメソッドコールをするというものです。 下記ソースもかなり見当違いであると思われますが、 大変申し訳ございませんが、ご教授よろしくお願いいたします。 ########################################################### # task_Test.cc ########################################################### #include <stdio.h> #include <stdlib.h> #include <unistd.h> // 起動プログラム数 #define PROGRAM_NUM (2) // 呼ばれ元メソッド1 int TestFunc1() {  // 戻り値  int ret = 0;  printf("TestFunc1 Start!\n");  return ret; } // 呼ばれ元メソッド2 int TestFunc2() {  // 戻り値  int ret = 0;  printf("TestFunc2 Start!\n");  return ret; } // 起動プログラムリスト (void*) programList[PROGRAM_NUM]={TestFunc1(),TestFunc2()} int main(int argc,char *argv[]) {  // ループカウンタ  int iCnt;  // ループ処理  for (iCnt=0; iCnt<PROGRAM_NUM; iCnt++)  {   programList[iCnt];  }  return 0; } ###########################################################

  • Cのプログラミングを勉強中です。

    Cのプログラミングを勉強中です。 Aの値のBに対する割合を表示すしたいのですが、以下のように記述してもうまくいきません。 どこを直したらよいか教えていただけますか。 #include <stdio.h> int main(void) { int n1 , n2 ; printf("二つの整数を入力してください。\n"); printf("整数A:"); scanf("%d", &n1); printf("整数B:"); scanf("%d", &n2); printf("Aの値はBの%d%%です。\n" , n1 / n2 * 100 ); return(0); }

  • コンパイルエラー

    Borlnd C++ compilerでコンパイルしたのですが、どうしてもエラーがでてしまいます。エラーは、不正な文字’’(0×8140)(関数 main) エラーE2206 文字' ' (0×8140)(関数 main) エラーE2206と二つ同じエラーがあると表示されます。本当に分からないので力を貸したください。お願いします。 /*読み込んだ二つの整数値の大きい方の値を求めて表示(条件演算子)*/ #include <stdio.h> int main(void) { int n1, n2, max; puts("二つの整数を入力してください。");   printf("整数1 : "); scanf("%d", &n1); printf("整数2 : "); scanf("%d", &n2); max = (n1 > n2) ? n1 : n2; printf("大きい方の値は%dです。\n", max); return 0;

  • c言語なのですが

    c言語なのですが #include<stdio.h> main() { int a; printf("整数を5回足し算する\n"); scanf("%d %d",&a); printf("a*5=%d\n",a*5); return(0); } でエラーが起こります どこを修正すればいいのでしょうか

  • C言語 "myfunc.h"がエラーになります。

    いつも大変お世話になっております。 C言語に関する質問です。 "myfunc.h"の箇所がコンパイルエラーになります。 全体のコードとコンパイルエラーが下記です。 #include <stdio.h> #include "myfunc.h" int main(void) { int num1, num2, ans; printf("1番目の整数を入力してください。\n"); scanf("%d", &num1); printf("2番目の整数を入力してください。\n"); scanf("%d", &num2); ans = max(num1, num2); printf("最大値は%dです。\n" , ans); return 0; } コンパイルエラー C:\MinGW>gcc text13.c -o text13 text13.c:2:20: fatal error: myfunc.h: No such file or directory #include "myfunc.h" ^ compilation terminated. です。 ご多忙のところ恐れ入ります。 どこがおかしいのか、 ご回答のほどよろしくお願い申し上げます。

このQ&Aのポイント
  • QL-800のラベルプリンターを使用していますが、パソコンと接続できない問題が発生しています。
  • 印刷をしようとすると、「PCとプリンターが繋がっていません」というエラーメッセージが表示されます。
  • 接続手順に抜けがある可能性があります。解決するためには、接続設定を再確認する必要があります。
回答を見る