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不同意参数类型。特别是,payandhours参数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元素的数组。(具体来说,[]优先级高于&,因此您需要括号告诉编译器该参数是对数组的引用而不是引用数组。)它还允许您使用 ol' Csizeof(nums)/sizeof(nums[0])来确定数组的大小; 不像让数组衰减为指针(在这种情况下sizeof会给你无用的信息,因为它被nums视为 anint*而不是 an int[ARRAY_SIZE]),通过引用传递它会保留此信息。


或者,如果您可以自由地重写代码并且您的编译器支持 C++11,则可以使用std::arrayC 样式数组来代替。

#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().

另请注意,如果您使用其中任何一个,则实际上不需要 pass int size,因为您可以使用sizeofor std::array.size()。不过,这确实有一点点污染全局命名空间的缺点,但我个人认为这是一个公平的权衡,以保证您的代码只有在函数被提供适当大小的数组时才能编译。

[请注意,如果您需要能够在不同时间传递不同大小的数组,这些方法都不会对您有用。]

对于我可能遗漏的任何错别字,我深表歉意。

于 2015-10-31T18:44:37.283 回答