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

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

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

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

Q&A

解決済

3回答

9008閲覧

C言語 エラー原因の究明

Kazuma_3

総合スコア3

C

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

0グッド

0クリップ

投稿2020/10/02 09:09

###C言語エラー究明
C言語で再帰的処理をするコードを書いてるのですが、実行するとエラーを吐かれてしまいます。問題は画像にて添付します。おそらく、関数のreturn のとこが違うと思うのですが、どうのように書き直せば良いかわかりません。わかる方いらっしゃいましたら、よろしくお願い致します。
イメージ説明

エラーメッセージ warning: non-void function does not return a value in all control paths [-Wreturn-type] }

該当のソースコード

c

1#include <stdio.h> 2 3double f1(int n); 4double f2(int n); 5 6int main (){ 7 int m; 8 printf("Input m:"); 9 scanf("%d",&m); 10 printf("a%d=%lf\n",m,f1(m)); 11 printf("b%d=%lf\n",m,f2(m)); 12} 13 14double f1(int n){ 15 if(n==0){ 16 return 1; 17 }else{ 18 return (1.5*f1(n-1)-f2(n-1)); 19 } 20 21} 22 23double f2(int n){ 24 if(n == 0) 25 return 2; 26 if(n >= 2 && (n%2 == 0)){ 27 return (2.0*f2(n-1)); 28 }else if(n >= 1 && (n%2 == 1)){ 29 return (0.5*f2(n-1)+f1(n-1)); 30 } 31} 32 33

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

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

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

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

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

guest

回答3

0

ベストアンサー

warning: non-void function does not return a value in all control paths

関数の中で条件分岐を行った場合、
想定する入力内容のA,B,Cに対して、

C

1if(x==A) return 1; 2if(x==B) return 2; 3else if(x==C) return 3;

等と書いた場合、AでもBでもCでもないDが来ると、どこにも引っかからずに関数の最後まで到達しますが、
そこには、return文は無いので、予期せぬ結果とreturnしてしまう可能性がある事を
示している警告です。

Java等の今どきの言語では、全てのパスにreturnが無いとエラーになりますが、
C言語はそこまで面倒を見てくれないので、returnが無いと、滅茶苦茶な値を返してしまいます。
(レジスタに残ってるゴミデータが返ってくる)


ちなみに、こう書いた場合は、最後にreturnが無くとも問題ありません。
Aか、Aでないか、以外のルートは存在しないからです。

C

1if(x==A) return 1; 2else return 2;

投稿2020/10/02 09:32

編集2020/10/02 09:36
amiya

総合スコア1216

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

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

Kazuma_3

2020/10/02 10:09

警告の原因を詳しくご教授していただいたので、ベストアンサーにさせていただきました!原因がわかり、すっきりしました! ありがとうございました!
guest

0

その警告メッセージ(エラーじゃ無い)、最後のelse ififに対するelseが無いからですね。

というか、

C

1 }else if(n >= 1 && (n%2 == 1)){ 2じゃなくて 3 }else{ 4でしょう。

あと、f1 f2という名前は問題に対応していないので、良くない名前です。a bにしましょう。

投稿2020/10/02 09:23

編集2020/10/02 09:37
otn

総合スコア84423

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

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

Kazuma_3

2020/10/02 10:07

関数f2の2個目のif文の条件式(n >= 2 && (n%2 == 0))を書けば、else文で処理できるということですね!問題文に、どちらとも条件が書かれているので、if文を書かないといけないと思っていました。無事、else文、othさんに教えて頂いたコードで書いたところ、警告は出ずに実行できました!早い回答ありがとうございました!
guest

0

int main (){

引数の指定がありません
返り値にintの記述があるけど、返り値の記述がありません

ついでに、提示されてるのはワーニングメッセージです。エラーではないです

投稿2020/10/02 09:13

編集2020/10/02 09:14
y_waiwai

総合スコア87719

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

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

otn

2020/10/02 09:24

ああ、mainもか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問