0

私は Microsoft Visual Studios Express 2012 を使用しており、月ごとの降雨量を取得して表示するプログラムを作成しようとしています。構造を使用する必要があり、バブル ソートを使用して最大から最小に表示する必要があります。私は自分のコードで迷子になったようで、どこが間違っていたのか混乱しています。現在、未解決の外部が 2 つあります。

//This program shows the months of the year with their associated rainfall amount.
#include <iostream> 
#include <string>
using namespace std;

const int SIZE = 12;

struct Rainfall
{
double rain[SIZE];

double getValue()
{
    double value = rain[SIZE];
    return value;
}

};

struct Months
{
const string MONTHS[SIZE];

Months()
{
    string MONTHS[SIZE] = {"January", "Feburary", "March",
                         "April", "May", "June", "July", 
                         "August","September","October",
                         "November","December"};
}

string getNames()
{
    string names = MONTHS[SIZE];
    return names;
}
};

//Function Prototypes
double getInput(const Months &, Rainfall &);
void sortData(Rainfall[],int);
void displayData(const Months, const Rainfall &);

int main()
{
Months timePeriod;
Rainfall amount;
Rainfall rain[SIZE];

getInput(timePeriod,amount);
sortData(rain,SIZE);
displayData(timePeriod,amount);

cin.ignore();
cin.get();
return 0;
}

/*****getInput*****/
double getInput(Months &timePeriod, Rainfall &amount)
{
cout << "\nPlease enter the amount of rainfall per month for the following  months:\n";

for(int counter = 0; counter <= 11; counter++)
{
    cout << timePeriod.MONTHS[counter] << ": ";
    cin >> amount.rain[counter];
    cout << endl;
    return amount.rain[counter];
}

}

/*****sortData*****/
void sortData(Rainfall array[], int SIZE)
{
Rainfall temp;
bool swap;

do
{
    swap = false;
    for(int count = 0; count < (SIZE-1); count++)
    {
        if(array[count].getValue() > array[count +1].getValue())
        {
            temp = array[count];
            array[count] = array[count +1];
            array[count + 1] = temp;
            swap = true;
        }
    }
} while (swap);
}

/*****displayData*****/
void displayData(Rainfall number[], Months names[], int SIZE)
{
for(int index = 0; index < SIZE; index++)
{
    cout << names[index].getNames() << endl;
    cout << number[index].getValue() << endl;
}
}
4

2 に答える 2

3

定義が宣言と一致していることを確認してください。

double getInput(const Months &, Rainfall &);
void sortData(Rainfall[],int);
void displayData(const Months, const Rainfall &);

それらすべてを見なくても、ここで不一致を見ることができますdisplayData

void displayData(const Months, const Rainfall &); // Declaration.
void displayData(Rainfall number[], Months names[], int SIZE) // Definition.

この場合の未解決の外部シンボルは、関数を宣言が、リンク段階で定義が見つからなかったことを意味します。

and引数displayDataを取る関数を宣言しました。あなたの定義は, and引数を取ります。したがって、これらは一致せず、コンパイラにとっては異なる関数です。const Months&const Rainfall&Rainfall[]Months[]int

関数のオーバーロードのおかげで、同じ名前の関数を使用できますが、引数は異なります。

于 2013-10-29T02:21:13.793 に答える
2

で実行するVS2010と、次のリンカー エラーが発生します。

1>main.obj : error LNK2019: unresolved external symbol "void __cdecl displayData(struct Months,struct Rainfall const &)" (?displayData@@YAXUMonths@@ABURainfall@@@Z) referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol "double __cdecl getInput(struct Months const &,struct Rainfall &)" (?getInput@@YANABUMonths@@AAURainfall@@@Z) referenced in function _main

つまり、2 つの関数の宣言と定義を一致させる必要があります (パラメーターは同じではありません)。

1. displayData
2. getInput
于 2013-10-29T02:45:18.573 に答える