0

なぜこれが実行されないのかわかりません。私はhours * payrate賃金配列に保存し、showResultsこの情報とcoutそれを取得することになっています。実行時に表示されるエラーは

error LNK2019: unresolved external symbol "void __cdecl showResults(int * const,int,double * const,double * const,double * const)" (?showResults@@YAXQAHHQAN11@Z) referenced in function
error LNK2019: unresolved external symbol "void __cdecl getEmployeeData(int * const,int,double * const,double * const,double * const)" (?getEmployeeData@@YAXQAHHQAN11@Z) referenced in function `_main`

以下のコード:

#include <iomanip>
#include <iostream>
using namespace std;

void getEmployeeData(int[], int, double[], double[], double[]);
void showResults(int[], int, double[], double[], double[]);


int main()
{
const int ARRAY_SIZE = 7;
int empId[ARRAY_SIZE] = {565, 845, 452, 130, 789, 758, 877};

double hoursWorked[ARRAY_SIZE]; // Holds hours worked
double payrate[ARRAY_SIZE]; // Holds pay rate
double wages[ARRAY_SIZE]; // Holds wages

getEmployeeData(empId, ARRAY_SIZE, payrate, hoursWorked, wages);

showResults(empId, ARRAY_SIZE, payrate, hoursWorked, wages);

system("pause");
    return 0;
}

void getEmployeedata(int nums[],int size,double pay[],double hours[],
double wages[])
{

//Hours worked and Pay rate
for(int index = 0; index < size; index++)
{
    cout << "Enter number of hours worked by employee number "
         << nums[index] << ": ";
    cin >> hours[index]; 
    cout << "\nEnter hourly pay rate ";
    cin >> pay[index];
    wages[index] = hours[index] * pay[index]; 
}
}

void showResults(int nums[], int size, double pay, double hours, double wages[])
{
for(int index = 0; index < size; index++)
{
    cout << "Employee Number Gross Wage " << endl
         << nums[index] << " " << wages[index];

}

}
4

4 に答える 4

3

の宣言と定義はshowResults、引数の型について意見が一致していません。特に、payおよびhours引数は宣言内にありますが、定義内double[]のみです。double

void showResults(int[], int, double[], double[], double[]) // Declaration
//                                 ↕↕        ↕↕
void showResults(int[], int, double  , double  , double[]) // Definition

配列を渡しているため、宣言は正しく、定義は正しくないようです。

名前についてのあなたの宣言と定義はgetEmployeeData一致しません。

void getEmployeeData(int[], int, double[], double[], double[]) // Declaration
/               ↕
void getEmployeedata(int[], int, double[], double[], double[]) // Definition

getEmployeeDataおそらく、残りのネーミングと一貫性を持たせたいと思うでしょう。

于 2013-04-06T18:17:42.333 に答える
1

関数名にタイプミスがあります:

getEmployeeData(empId, ARRAY_SIZE, payrate, hoursWorked, wages);

ただし、定義では次のようになります。

getEmployeedata(...);

ここでも不一致:

 void showResults(int nums[], int size, double pay, double hours, double wages[])
                                            //^^^^^^^^^^^^^^^^^
于 2013-04-06T18:19:47.583 に答える
1

関数に配列を渡したい場合は、関数を次のように書いてみてください。

void getEmployeeData(int*, int, double*, double*, double*);
void showResults(int*, int, double*, double*, double*);

配列を渡すと、その配列の0番目のインデックスへのポインターが渡されるためです。また、言われたように、コードにタイプミスがありますgetEmployeedatagetEmployeeData

修正されたコードは次のとおりです。

#include <iomanip>
#include <iostream>
using namespace std;

void getEmployeeData(int*, int, double*, double*, double*);
void showResults(int*, int, double*, double*, double*);


int main()
{
const int ARRAY_SIZE = 7;
int empId[7] = {565, 845, 452, 130, 789, 758, 877};

double hoursWorked[ARRAY_SIZE]; // Holds hours worked
double payrate[ARRAY_SIZE]; // Holds pay rate
double wages[ARRAY_SIZE]; // Holds wages

getEmployeeData(empId, ARRAY_SIZE, payrate, hoursWorked, wages);

showResults(empId, ARRAY_SIZE, payrate, hoursWorked, wages);

system("pause");
    return 0;
}

void getEmployeeData(int nums[],int size,double pay[],double hours[],double wages[])
{

//Hours worked and Pay rate
for(int index = 0; index < size; index++)
{
    cout << "Enter number of hours worked by employee number "
         << nums[index] << ": ";
    cin >> hours[index];
    cout << "\nEnter hourly pay rate ";
    cin >> pay[index];
    wages[index] = hours[index] * pay[index];
}
}

void showResults(int *nums, int size, double *pay, double *hours, double *wages)
{
for(int index = 0; index < size; index++)
{
    cout << "Employee Number Gross Wage " << endl
         << nums[index] << " " << wages[index];

}

}
于 2013-04-06T18:29:36.553 に答える
0

各配列に含まれる要素の数が正確にわかっているのでARRAY_SIZE、グローバル定数を作成してみて (関数プロトタイプと同じスコープ内にあるように)、次のようなことができるようにすることができます。

void getEmployeeData(int (&)[ARRAY_SIZE], int, double (&)[ARRAY_SIZE], double (&)[ARRAY_SIZE], double (&)[ARRAY_SIZE]);
void showResults(int (&)[ARRAY_SIZE], int, double (&)[ARRAY_SIZE], double (&)[ARRAY_SIZE], double (&)[ARRAY_SIZE]);

void getEmployeeData(int (&nums)[ARRAY_SIZE], int size, double (&pay)[ARRAY_SIZE], double (&hours)[ARRAY_SIZE], double (&wages)[ARRAY_SIZE]) {
// Function body
}
void showResults(int (&nums)[ARRAY_SIZE], int size, double (&pay)[ARRAY_SIZE], double (&hours)[ARRAY_SIZE], double (&wages)[ARRAY_SIZE]) {
// Function body
}

さて、これはぎこちなく見えますが、関数が正確 ARRAY_SIZEな要素を持つ配列への参照を受け取ることをコンパイラに伝えます。(具体的には、[]よりも優先順位が高い&ため、引数が参照の配列ではなく配列への参照であることをコンパイラに伝えるために括弧が必要です。) また、古い Csizeof(nums)/sizeof(nums[0])を使用して配列のサイズを決定することもできます。 ; 配列をポインターに減衰させるのとは異なり (この場合、ではなくと見なされるsizeofため、役に立たない情報が得られます)、参照によって渡すと、この情報が保持されます。numsint*int[ARRAY_SIZE]


std::arrayまたは、コードを自由に書き直すことができ、コンパイラが C++11 をサポートしている場合は、C スタイルの配列の代わりに使用できます。

#include <array>
using namespace std;

void getEmployeeData(array<int, ARRAY_SIZE>, int, array<double, ARRAY_SIZE>, array<double, ARRAY_SIZE>, array<double, ARRAY_SIZE>);
void showResults(array<int, ARRAY_SIZE>, int, array<double, ARRAY_SIZE>, array<double, ARRAY_SIZE>, array<double, ARRAY_SIZE>);


array<int, ARRAY_SIZE> empId = {565, 845, 452, 130, 789, 758, 877};

array<double, ARRAY_SIZE> hoursWorked; // Holds hours worked
array<double, ARRAY_SIZE> payrate; // Holds pay rate
array<double, ARRAY_SIZE> wages; // Holds wages

コンテナstd::arrayとして、C スタイルの配列 (つまり ) と同じ構文で使用できるoperator[]ため、実際に配列を使用するコードを書き直す必要はありません。getEmployeeData()また、 のようなものを使用しshowResults()て、配列のサイズを直接確認することもできますnums.size()

また、これらのいずれかを使用する場合、またはint sizeを使用できるため、実際に を渡す必要はないことに注意してください。ただし、これにはグローバル名前空間を少し汚染するという欠点がありますが、個人的には、関数に適切なサイズの配列が与えられた場合にのみコードがコンパイルされることを保証するというセキュリティの公正なトレードオフであると考えています.sizeofstd::array.size()

[異なる時間に異なるサイズの配列を渡すことができるようにする必要がある場合、これらの方法はどちらも役に立たないことに注意してください。]

見逃した可能性のあるタイプミスをお詫び申し上げます。

于 2015-10-31T18:44:37.283 に答える