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

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

ただいまの
回答率

90.45%

  • C

    4682questions

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

  • コンパイルエラー

    41questions

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

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

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 1,828

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/ツール等のバージョンなど)

より詳細な情報

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+7

else (ave>=40) 

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

else if (ave>=40)

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

(ave>=40)

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

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


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/11 07:42

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

    キャンセル

  • 2017/05/11 09:17

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

    キャンセル

+1

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/11 07:40

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

    キャンセル

  • 2017/05/11 08:55

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

    キャンセル

0

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


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/11 07:42

    ありがとうございます

    キャンセル

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/11 07:39

    ありがとうございます

    キャンセル

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

  • ただいまの回答率 90.45%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • C

    4682questions

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

  • コンパイルエラー

    41questions

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