簡単な一連の関数を作成しました。最後の関数を呼び出そうとすると、「リンカーコマンド」エラーが発生します。構文は正しいが、私のプログラムはコンパイルされない。私は何かを見逃していますか、これはIDE問題ですか?
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <time.h>
using namespace std;
// Function Prototypes
int numGen ();
int questSol ();
int questAns ();
int main() {
// Store values of functions in variables
int ans = questAns();
int sol = questSol();
if (ans == sol){
cout << "Very good! Press Y to continue" << endl;
questAns();
} else {
cout << "Incorrect. Please try again" << endl;
cin >> ans;
if(ans == sol){
questAns();
}
}
return 0;
};
//Generates two random numbers between zero and ten and returns those numbers
int numGen () {
srand(time(0));
int one = Rand() % 10;
int two = Rand() % 10;
return one;
return two;
};
//Takes in the random numbers, multiplies them, and returns that result
int questSol (int one, int two) {
int solution = one * two;
return solution;
}
//Takes in random numbers, displays them in cout statement as question, receives and returns user answer to
//question
int questAns (int one, int two) {
int answer;
cout << "How much is " << one << " times " << two << "? \n";
cin >> answer;
return answer;
}
関数を前方宣言します:
int questAns ();
そして、後で署名を使用して関数を定義します。
int questAns (int one, int two);
C++では、関数は同じ名前を持つことができますが、異なるパラメーター(オーバーロードされた関数)を持つことができるため、転送宣言してから呼び出しを試みるquestAnsを実際に定義したことはありません。
注:questSolでも同じ問題があります。
ローカル変数のスコープをよく理解していないようです。
NumGen内で、1つと2つの2つのintを定義します。ブロック内で定義された変数(中括弧:{})は、そのブロック内にのみ存在します。彼らはそれにローカルです。識別子は、定義されている最も内側のブロック内でのみ有効であり、いったん終了すると、そのメモリは解放されます。あなたがしようとしているように2つのintを返すことも不可能です。
これらのintが他の2つの関数で利用できることを期待しているようです。
可能な最小の変更は、int 1つと2つのglobal変数を作成することです。つまり、任意のブロックの外側(通常はコードの最上部)で定義します。次に、すべての関数がグローバル変数を参照できるため、関数定義からパラメーターリストを削除します。より複雑なプログラムではグローバルがコードに大混乱をもたらすので、これは一般に悪いプログラミング慣行と考えられますが、この単純なプログラムでは機能し、変数スコープの理解を実践する機会を与えます。
もう1つの解決策は、あなたが試みていたものにもっと沿って、2つのintのARRAYを定義し、それを返すことです。次に、その配列を他の2つの関数に渡します。それはそれを行うより良い方法であり、配列について学ぶ機会を与えます。
いくつかの問題があります:
numGen
-この方法で2つの個別の値を返すことはできません
// Function Prototypes
int numGen ();
int questSol ();
int questAns ();
3つの関数があり、そのすべてがint
を返し、noパラメーターで呼び出されると言います。
そのため、リンカはint_questSol_void
およびint_questAns_void
のフィンガープリントを持つ関数を探しています-次に、intを返し、入力として3つのintを受け取る2つの関数を宣言します-これらはint_questAns_int_int
およびint_questSol_int_int
。
その結果、リンカは、あなたが見つけられない関数を呼び出しているとうめいています。