2013-12-15 106 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]); 
相關問題