如何修复" Error LNK2019 : unresolved external symbol ... "

How To Fix " Error LNK2019 : unresolved external symbol ... "

本文关键字:unresolved external symbol LNK2019 何修复 Error      更新时间:2023-10-16

我试着为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作为参数。

链接器所指的"未定义符号"是您的函数datacalcHL。它们中的三个在main()函数中用作期望使用单个浮点值的函数。你的原型也是如此。

但是您的实现使用矩阵作为参数,而不是浮点。C编译器应该抱怨函数datacalcHL中使用了错误的类型参数,但C++编译器会将其解释为datacalcHL是重载函数,因此它们可能有多个实现。您提供了其中一个(以矩阵作为参数),但编译器需要另一个(用浮点作为参数)。链接器负责查找重载函数的所有已使用的实现。由于找不到它们,它抛出了那个错误。