我试着为5名学生的期中和期末成绩制作一个计算器。在一个数组a[5][3]中,40%的期中成绩和60%的期末成绩。a[5][3]因为有5个学生,3行因为期中1行,另一行是期末,最后一行是总成绩(40%的期中成绩+60%的期末成绩)。我得到了"错误lnk2019"。那个代码出了什么问题?谢谢
#include "stdafx.h"
#include <iostream>
using namespace std;
float a[5][3];
float data(float x);
float calc(float y);
float HL(float z);
int main()
{
data(a[5][3]);
calc(a[5][3]);
HL(a[5][3]);
system("pause");
return 0;
}
float data(float x[5][3])
{
for (int i = 0; i < 5; i++)//Getting the Grades
{
cout << "Enter midterm for St" << i + 1 << " : ";
cin >> x[i][0];
cout << "Enter final for St" << i + 1 << " : ";
cin >> x[i][1];
}
return x[5][3];
}
float calc(float y[5][3])
{
for (int i = 0; i < 5; i++)//Calc. Overall Grades
{
y[i][2] = y[i][0] * 0,4 + y[i][1] * 0,6;
}
return y[5][3];
}
float HL(float z[5][3])
{
float max = 0, min = 0;
for (int i = 0; i < 5; i++)//Finding Highest and Lowest
{
if (z[i][2]>max)
{
max = z[i][2];
}
if (z[i][2] < min)
{
min = z[i][2];
}
}
cout << "The Lowest Grade : " << min << "nThe Highest Grade : " << max;
return z[5][3];
}
我建议您复习一下数组基础知识。http://www.cplusplus.com/doc/tutorial/arrays/
调用函数的语法不正确。此外,您的函数原型也不匹配。
float data(float x);
和
float data(float x[5][3])
{
此外,在调用函数时,不要指定尺寸。
float someFloat = data( a );
您声明了两个函数
float data(float x);
float calc(float y);
并使用它们作为float
参数(否则编译器会抱怨)。然而,您随后用一个完全不同的签名来定义它们:
float data(float x[5][3]) { ... }
float calc(float y[5][3]) { ... }
声明具有完全不同的类型。虽然您声明的函数使用一个float
作为参数,但您定义的函数使用指向浮点数组的指针作为参数。更确切地说,您定义的函数将指向3个float
的数组的指针作为自变量,因为它们等效于以下声明:
float data(float (*x)[3]);
float calc(float (*y)[3]);
此外,修复这些调用:
data(a[5][3]);
calc(a[5][3]);
HL(a[5][3]);
因为您引用的是矩阵a
中不存在的元素。要么传递一个未定义的值,要么得到一个segfault。
请记住,a
矩阵的最后一个元素是a[4][2]
。如果您的意图是将所有矩阵传递给您的函数,而不是单个元素,那么您必须重新定义原型,并仅使用矩阵名称a
作为参数。
链接器所指的"未定义符号"是您的函数data
、calc
和HL
。它们中的三个在main()
函数中用作期望使用单个浮点值的函数。你的原型也是如此。
但是您的实现使用矩阵作为参数,而不是浮点。C编译器应该抱怨函数data
、calc
和HL
中使用了错误的类型参数,但C++编译器会将其解释为data
、calc
和HL
是重载函数,因此它们可能有多个实现。您提供了其中一个(以矩阵作为参数),但编译器需要另一个(用浮点作为参数)。链接器负责查找重载函数的所有已使用的实现。由于找不到它们,它抛出了那个错误。