質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

Q&A

解決済

4回答

9769閲覧

C言語 エラーメッセージがよくわからない所を指摘してきます

wYr2Bm61tES7t8T

総合スコア8

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

0グッド

0クリップ

投稿2017/05/10 13:59

###C言語の初心者です
最近プログラミングの勉強を始めた者です。
質問するのが初めてなので、かなりおかしな所があると思います。すみません

今、関数のreturn文を使って点数の評価を求めるプログラムを書きましたが、
コンパイルエラーの意味が分かりません。(エラー文の日本語自体はわかります)
どういうことかというと、return最後に記述し、値を戻したはずなのにそれでも
エラー文には「値を返すべき」と表示されます。

エラーメッセージ

警告 W8019 戻り値点数.c 59: コードは効果を持たない(関数 getlank ) エラー E2379 戻り値点数.c 59: ステートメントにセミコロン(;)がない(関数 getlank ) 警告 W8070 戻り値点数.c 64: 関数は値を返すべき(関数 getlank ) 警告 W8004 戻り値点数.c 64: 'lank' に代入した値は使われていない(関数 getlank ) *** 1 errors in Compile *** ### ```C言語 ```#include <stdio.h> //関数のプロトタイプ宣言 char getlank(double ave); void main() { //ローカル変数の宣言 double ave; char lank[10]; //評価 //関数で求めた結果を格納したり、表示のため int index; //添字 //main()専用のローカル変数 int i; //添字 //点数を入力 printf("平均点を入力"); scanf("%lf" ,&ave); //評価を求める for(index=0; ave>=0;index++) { lank[index]=getlank(ave); //平均から評価を求める //次の点数を入力 printf("点数を入力してください"); scanf("%lf" ,&ave); } //評価を表示 printf("評価:"); for(i=0;index<i;i++) { printf("%c" ,lank[i]); } } // 評価を求める関数 char getlank(double ave) { // *ave = 点数 char lank; if (ave>= 80) { lank='A'; } else if (ave>=60) { lank='B'; } else (ave>=40) { //59行目です lank = 'C'; } return lank; } //64行目です ###試したこと まずはセミコロンがつくべきところについているか確認しましたが ダメな所はないように見えます。しかし「エラー E2379 戻り値点数.c 59: ステートメントにセミコロン(;)がない(関数 getlank )」と表示されます。 なぜこのようなずれた位置のことに指摘が来るのでしょうか ###補足情報(言語/FW/ツール等のバージョンなど) より詳細な情報

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

else (ave>=40)

に注目です。おそらく質問者さんは

else if (ave>=40)

と書きたかったのでしょう。ifが抜けると何が起こるかと言えば・・・
まずコンパイラーはelseの次には「文」がくるはずだと考えます。ifがあればそれはif文と見做しますがifがなく(ave>=40)がありますね。

(ave>=40)

は条件式ですが、条件式は式の一種で、式は文の一種でもあるので、(ave>=40)までは文と解釈されます。さて文の次にはセミコロンが必要ですのでそれでご質問のようなエラーメッセージが出ます。

文法が詳しくわかればわかるほどこうした推測は容易になりますが、自分が意図せずに文法エラーをやらかしてしまっている今回のようなケースではなかなか「なぜコンパイラーがこんなことをいうのか」が分からないこともあるでしょう。しかし文法エラー的なものが発生したら、どこかに文法エラーがあるのは確実です。多くの文法エラーを経験しているうちに、多分こうしたコンパイラーのメッセージにも慣れていくと思いますよ。


追記:少し補足します。他にもエラーが出ていますが、上に書いたように文法エラーが一つあるとコンパイラーはなんとか辻褄を合わせようとします。その結果、どんどんおかしな解釈をしていき、どんどんヘンテコなエラーメッセージが増えていきます。どこが根本的なエラーか最初は難しいかも知れませんが、まずは文法エラーを修正することを優先してみてください。一つの文法エラーを直すと、それ以外のヘンテコなエラーメッセージが自然に消えることも珍しくないのです。

投稿2017/05/10 14:15

編集2017/05/10 14:29
KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wYr2Bm61tES7t8T

2017/05/10 22:42

こんなに丁寧な回答をいただけるとは思っていませんでした。 本当にありがとうございます。
KSwordOfHaste

2017/05/11 00:17

文法エラーはあまり歓迎される質問とはいえませんが、それでも「コード」「正確なエラーメッセージ」「ご自分がどう解釈して何が疑問か」が具体的かつ明確に記載されていたため、同種の質問に比べて回答者の回答意欲は高くなります。それが人情というものではないでしょうか・・・
guest

0

本件の答えは既出なので他の観点から。

コンパイルは機械処理なので、些細な間違いであっても、エラーメッセージが頓珍漢になることは多々あります。ですので、一部を一時削除(たとえばコメントにしておく等)して絞り込みながら、作業を進めることが有効となります。

このほか私の経験則ですが、括弧の不適切な対応等、文法に特に大きな影響を与える記号や構文は些細なミスで意味不明なエラーメッセージが出てきます。ですので、予め構文を先に固めてから細部を書くとミスが減ります。ついでに、全角スペースにあってはもはや目視確認は不可能です。

投稿2017/05/10 14:38

HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wYr2Bm61tES7t8T

2017/05/10 22:40

ありがとうございます こんなに親切に回答していただけるとは思っていませんでした。
ozwk

2017/05/10 23:55

全角スペースはエディタによっては強調表示してくれますね
guest

0

ランクDも加えてみました

#include <stdio.h> //関数のプロトタイプ宣言 char getlank(double ave); void main() { //ローカル変数の宣言 double ave; char lank[10];//評価 //関数で求めた結果を格納したり、表示のため int index; //添字 //main()専用のローカル変数 int i; //添字 //点数を入力 printf("平均点を入力"); scanf("%lf" ,&ave); //評価を求める for(index=0;ave>=0;index++) { lank[index]=getlank(ave); //平均から評価を求める if (index>=9) break; //次の点数を入力 printf("点数を入力してください"); scanf("%lf" ,&ave); } //評価を表示 printf("評価:"); for(i=0;i<index;i++) { printf("%d:(%c) " ,i+1,lank[i]); } } // 評価を求める関数 char getlank(double ave) { // *ave = 点数 if (ave>= 80) { return 'A'; } else if(ave>=60) { return 'B'; } else if(ave>=40) { return 'C'; }else{ return 'D'; } }

投稿2017/05/10 15:38

A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

0

else (ave>=40) { //59行目です

else if (ave>=40)と直してみるとどうでしょうか?
(もしくは、(ave>=40)を削除する)

投稿2017/05/10 14:10

yoorwm

総合スコア1305

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問