web-dev-qa-db-ja.com

Xcodeリンカーコマンドが終了コード1 c ++で失敗しました

簡単な一連の関数を作成しました。最後の関数を呼び出そうとすると、「リンカーコマンド」エラーが発生します。構文は正しいが、私のプログラムはコンパイルされない。私は何かを見逃していますか、これは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;
}
7
ace7

関数を前方宣言します:

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つの関数に渡します。それはそれを行うより良い方法であり、配列について学ぶ機会を与えます。

4
mock_blatt

いくつかの問題があります:

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

その結果、リンカは、あなたが見つけられない関数を呼び出しているとうめいています。

0
Steve Barnes