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

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

新規登録して質問してみよう
ただいま回答率
85.48%
コンパイル

コンパイルとは、プログラミング言語のテキストソース(ソースコード)をコンピュータ上で実行可能な形式(オブジェクトコード)に変換することをいいます

コンパイルエラー

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

1回答

2810閲覧

エラーの意味が分かりません

sharoccu

総合スコア26

コンパイル

コンパイルとは、プログラミング言語のテキストソース(ソースコード)をコンピュータ上で実行可能な形式(オブジェクトコード)に変換することをいいます

コンパイルエラー

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/11/28 11:40

##解決したい事
C++言語で、電卓的なものを作っていました。そして、そのプログラムのコンパイル時に次に示すようなエラーが出てくるんです。一応、実行可能ファイル(.exe)は作成してくれるのですが、このエラーが気になるのです。エラーの意味を教えてください。

##コンパイラの画面
ソースコードもこの後に提示します。

「ファイル名」(90) : warning C4717: 'sqrt': すべてのコントロールのパス、関数を回帰するとラン タイム スタック オーバーフローが発生します。 「ファイル名」(136) : warning C4700: 初期化されていないローカル変数 'second' が使用されます 「ファイル名」(136) : warning C4700: 初期化されていないローカル変数 'first' が使用されます 「ファイル名」(148) : warning C4700: 初期化されていないローカル変数 'value' が使用されます

##ソースコード
コンパイルエラーの内容は前に書いてあります。

C++

1#include <iostream> 2using namespace std; 3 4double addition(double first, double second) { 5 using namespace std; 6 double ans; 7 8 cout << endl; 9 //数値を入力させる 10 cout << "A+B=Cの時、Aに当てはまる数を入力してください:"; 11 cin >> first; 12 cout << "A+B=Cの時、Bに当てはまる数を入力してください:"; 13 cin >> second; 14 15 //計算する 16 ans = first + second; 17 18 //戻り値として、ansを返す 19 return ans; 20} 21 22double subtraction(double first, double second) { 23 using namespace std; 24 double ans; 25 26 cout << endl; 27 //数値を入力させる 28 cout << "A-B=Cの時、Aに当てはまる数を入力してください:"; 29 cin >> first; 30 cout << "A-B=Cの時、Bに当てはまる数を入力してください:"; 31 cin >> second; 32 33 //計算する 34 ans = first - second; 35 36 //戻り値として、ansを返す 37 return ans; 38} 39 40double multiplication(double first, double second) { 41 using namespace std; 42 double ans; 43 44 cout << endl; 45 //数値を入力させる 46 cout << "A×B=Cの時、Aに当てはまる数を入力してください:"; 47 cin >> first; 48 cout << "A×B=Cの時、Bに当てはまる数を入力してください:"; 49 cin >> second; 50 51 //計算する 52 ans = first * second; 53 54 //戻り値として、ansを返す 55 return ans; 56} 57 58double division(double first, double second) { 59 using namespace std; 60 double ans; 61 62 cout << endl; 63 //数値を入力させる 64 cout << "A÷B=Cの時、Aに当てはまる数を入力してください:"; 65 cin >> first; 66 cout << "A÷B=Cの時、Bに当てはまる数を入力してください:"; 67 cin >> second; 68 69 //計算する 70 ans = first / second; 71 72 //戻り値として、ansを返す 73 return ans; 74} 75 76double sqrt(double value) { 77 using namespace std; 78 double ans; 79 80 cout << endl; 81 //数値の入力 82 cout << "平方根を求めたい数を入力してください:"; 83 cin >> value; 84 85 //計算 86 ans = sqrt(value); 87 88 //戻り値 89 return ans; 90} 91 92int error() { 93 using namespace std; 94 string o; //エラー終了の確認 95 96 cout << endl; 97 cout << "error!!!" << endl; 98 cout << "プログラムを終了します。何か文字を入力して、enterキーを押してください..."; 99 cin >> o; 100 101 return 1; 102} 103 104int main() { 105 string explanation; //使い方/何算か 106 double first; //一つ目の数 107 double second; //二つ目の数 108 double value; //値 109 double ans; //答え 110 string a; 111 112 cout << "Ver2.0" << endl; 113 114 cout << "このアプリの使い方を見ますか?(入力した後、enterキーを押してください)" << endl; 115 cout << "はい:a\tいいえ:b" << endl; 116 cin >> explanation; 117 118 if (explanation == "a") { 119 cout << endl; 120 cout << "計算機です。" << endl; 121 cout << "これからの質問に答えた後は、毎回enterキーを押してください。" << endl; 122 } 123 if (explanation != "a" && explanation != "b") { 124 error(); 125 126 return 0; 127 } 128 129 do { 130 cout << endl; 131 cout << "何の計算をするかを下から選んで下さい。" << endl; 132 cout << "a:足し算\tb:引き算\tc:掛け算\td:割り算\te:平方根" << endl; 133 cin >> explanation; 134 135 if (explanation == "a") { 136 ans = addition(first, second); 137 } 138 else if (explanation == "b") { 139 ans = subtraction(first, second); 140 } 141 else if (explanation == "c") { 142 ans = multiplication(first, second); 143 } 144 else if (explanation == "d") { 145 ans = division(first, second); 146 } 147 else if (explanation == "e") { 148 ans = sqrt(value); 149 } 150 else { 151 error(); 152 return 0; 153 } 154 155 //計算結果を表示させる 156 cout << ans << endl; 157 158 //まだ計算しますか? 159 cout << endl; 160 cout << "まだ計算しますか?(はい:a\tいいえ:[a]以外の文字):"; 161 cin >> a; 162 } while (a == "a"); 163 164return 0; 165}

##利用環境
コンパイラ:visual studio 2019 (コニュニティ)に付属しているもの

##最後に
質問等あれば、なんでも聞いてください。
初心者ですので、出来るだけ分かりやすく回答していただけると助かります。

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

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

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

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

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

guest

回答1

0

「ファイル名」(90) : warning C4717: 'sqrt': すべてのコントロールのパス、関数を回帰するとラン タイム スタック オーバーフローが発生します。

sqrt関数の中からsqrt関数を呼び出しています。このような「自分自身を呼び出す関数」は再帰関数と呼ばれますが、再帰関数が止まるには再帰しない(自分自身を呼び出さない)パスが必要になります。
sqrt関数の実装は必ず自分自身を呼び出すようになっているので、理論的には無限に自分自身を呼び出し続けます。実際にはリソースに限りがあるので、実行時にスタックを少しずつ消費していって、そのうちスタックが溢れ、実行時エラーとなります(ランタイムスタックオーバーフロー)
C++標準ライブラリの平方根関数を呼び出したいのならstd::sqrtを呼ぶべきでしょう。
なお、using namespace stdを使うとこのような名前の衝突の危険性があるということを認識すべきです。軽々しく使う機能ではありません。

「ファイル名」(136) : warning C4700: 初期化されていないローカル変数 'second' が使用されます
「ファイル名」(136) : warning C4700: 初期化されていないローカル変数 'first' が使用されます

addition関数に渡す時に読み込まれているfirstsecondが一度も初期化されていないために出ている警告です。初期化されていない変数には何が入っているか分からず、その読み込みアクセスは未定義動作です。
addition関数の中で書き込むために変数を渡したいのなら、値ではなく参照を引数にしなければいけません。ただ、関数の実装を見る限りでは、addition関数のローカル変数として確保すれば良さそうに見えます

「ファイル名」(148) : warning C4700: 初期化されていないローカル変数 'value' が使用されます

こちらも同様に sqrt 関数に渡す時に未初期化のvalueに対する読み込みアクセスが発生することが原因です。

投稿2020/11/28 12:03

kazatsuyu

総合スコア158

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問