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

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

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

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

Q&A

解決済

4回答

13540閲覧

インデントワーニングについて

ikuo-biyori

総合スコア56

C

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

0グッド

0クリップ

投稿2017/05/10 22:40

いつもお世話になっています。C言語初心者でただいま勉強中です。インデントワーニングについて質問させていただきます。あるプログラムを作っていたんですが、コンパイルがうまく通らず、{の数があってないとエラーが出たんですが、どこが間違っているかわかりません。よろしくお願いします。

C言語

1コード
#include<stdio.h> int Nibusearch(int A[],int n,int key){ int i=0,left=0,right=n,mid; while(A[i]!=key){ i++; mid=(left+right)/2; if(key==A[mid]){ return mid; } else if(key<A[mid]){ right=mid; } else if(key>A[mid]){ left=mid; } } } int main(){ int i,n,A[10000+1],q,key,total=0; scanf("%d",&n); for(i=0;i<n;i++){ scanf("%d",&A[i]); } scanf("%d",&q); for(i=0;i<q;i++){ scanf("%d",&key); if(Nibusearch(A,n,key)){ total++; } } printf("%d\n",total); return 0; }

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

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

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

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

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

KSwordOfHaste

2017/05/10 23:16

このソースコードではエラーは起きないように見えます。違うソースを張り付けたのでは?
ikuo-biyori

2017/05/10 23:18

gcc den.c den.c:17:1: warning: control may reach end of non-void function [-Wreturn-type] } ^ 1 warning generated. というワーニングがでます
ozwk

2017/05/10 23:53

{の数があってないというエラーじゃないですよねそれ
guest

回答4

0

{の数があってないとエラーが出たんです

が最初の質問文の内容ですが、実際のエラーメッセージは

gcc den.c den.c:17:1: warning: control may reach end of non-void function [-Wreturn-type]

}
^ 1 warning generated.

だったわけで、残念ながら意味が違います。

意味は「voidでない関数の実行において制御(実行される文の道筋といった意味合い)が関数の末尾に到達する可能性がある」要するにreturn文が実行されない可能性があるよ」ということです。それはwhile文の条件が不成立の場合に起き得ますね?


教訓:推測だけでなく事実(エラーメッセージ)を質問文に明記しましょう。

正確なメッセージが書かれていればZuishinさんはまったく違った回答をしたはずです。

プログラマーはこうした曖昧さ、推測、勘違いによって振り回される経験をいやになるほど数多く積んでいき、いつしか事実が重要という点に本当に気づくのだと思います。それがわかっていないとteratailの質問ヒント3-4にエラーメッセージを書きましょうとあってもその重要性がピンとこないのでしょう。

本件はエラーの内容よりもこの教訓の方こそを学ぶよいきっかけではないか・・・そんなことを感じました。

投稿2017/05/11 01:26

KSwordOfHaste

総合スコア18392

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

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

0

ベストアンサー

まずは出力されたエラーメッセージを正しく理解しないといけません。
恐らく、こんなエラーが出たと思われます。

Main.c:17:1: warning: control may reach end of non-void function [-Wreturn-type] } ^ 1 warning generated.

確かに括弧がおかしいよって言われているようにも見えますが、文章をよく読めばそうではないことがわかります。
読んでもわからなければググってみましょう。
沢山でますが、わかりやすそうな以下などを見てみればよろしいでしょう。
http://kangjuprogramdiary.blog96.fc2.com/blog-entry-9.html

修正方法としては、関数の終わりにきちんと到達する作りにすれば良いです。
簡単なのはreturnしているところをbreakに置き換えて、関数の終わりでreturnですね。
その場合、コンパイラによってはmidが初期化されていないとか言われる場合があるので、初期値を与えておいた方がよいでしょう。

c

1int Nibusearch(int A[],int n,int key){ 2 int i=0,left=0,right=n,mid=0; 3 while(A[i]!=key){ 4 i++; 5 mid=(left+right)/2; 6 if(key==A[mid]){ 7 break; 8 } 9 else if(key<A[mid]){ 10 right=mid; 11 } 12 else if(key>A[mid]){ 13 left=mid; 14 } 15 } 16 return mid; 17}

投稿2017/05/11 00:37

ttyp03

総合スコア16996

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

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

ikuo-biyori

2017/05/12 04:42

ありがとうございます。よくわかりました。
guest

0

制御文が非void関数の終わりまで達してます的な意味なので、
{}の数があわないんじゃなくて、関数の最後にreturn文が無いので、
if else文のどの条件にもマッチしなかった場合、
に戻すべき値が無いって事ではないでしょうか?

投稿2017/05/10 23:38

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Zuishin

2017/05/10 23:41

本当ですね。{} の数は合っていました。
guest

0

括弧の対応を表示できるまともなテキストエディタを使って下さい。
それがこの質問の正しい解決法です。

追記

対応が表示できればエラーメッセージの誤読も無かったのでしょうが、最終的に正しい解決法ではありませんでした。

投稿2017/05/10 22:48

編集2017/05/10 23:54
Zuishin

総合スコア28656

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問