2013-12-15 98 views
0

我试图为5名学生的中期和最终成绩制作计算器。 40%的中期和60%的决赛阵列a [5] [3]。 a [5] [3],因为5名学生,3条线,因为1中期决赛的另一个和最后一个整体成绩(中期40%+总决赛60%)。我得到“错误lnk2019”。该代码有什么问题?谢谢..如何解决“错误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]; 
} 
+1

在未来,请附上*完整*和*未经编辑*错误日志的问题。如果你也发布了源代码,请指出错误的来源, –

+0

尽管如此,我觉得这个问题很有趣,因为错误不是来自编译器,而是来自链接器。当使用float作为需要矩阵的函数的参数时(一个实际的指针),C编译器应该抱怨错误的类型。像“错误:不能使整数指针...”。相反,编译器假定这三个函数是重载的,并让链接器找到三个函数的实际执行任务,这些函数更适合他们所调用的参数。 –

回答

1

我建议你通过一个教程来刷新你的数组基础知识。 http://www.cplusplus.com/doc/tutorial/arrays/

您调用函数的语法不正确。此外,你的函数原型不匹配。

float data(float x); 

float data(float x[5][3]) 
{ 

而且,调用函数时,没有指定的尺寸。

float someFloat = data(a); 
0

此外,修复这些来电:

data(a[5][3]); 
calc(a[5][3]); 
HL(a[5][3]); 

因为你引用矩阵a一个不存在的元素。要么你传递一个未定义的值,要么你会得到一个段错误。

请记住,您的a矩阵的最后一个元素是a[4][2]。如果您的意图是将所有矩阵传递给函数,而不是单个元素,则必须重新定义原型,并仅使用矩阵名称a作为参数。

链接器提到的“未定义符号”是您的函数datacalcHL。它们中的三个用于您的main()函数,作为期望单个浮点值使用的函数。你的原型也是如此。

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

0

你宣布两项功能

float data(float x); 
float calc(float y); 

...并使用他们float说法,太(否则编译器会抱怨)。然而,您然后用完全不同的签名来定义它们:

float data(float x[5][3]) { ... } 
float calc(float y[5][3]) { ... } 

声明具有完全不同的类型。虽然您声明的函数需要一个float作为参数,但您定义的函数会将指针指向浮点数组作为参数。更确切地说,您定义的函数需要一个指向3个float S作为arguement数组,因为它们等同于本声明:张贴有关编译器或链接错误问题时

float data(float (*x)[3]); 
float calc(float (*y)[3]); 
相关问题