2011-12-08 64 views
1

當我運行該程序時出現此錯誤。它編譯成功,但給了我一些關於未初始化變量的警告,我認爲這些變量已經初始化。我收到錯誤「調試錯誤!運行時檢查失敗#3-變量'sumMaleGPA'正在使用,未經初始化。」調試錯誤!運行時檢查失敗#3

#include <iostream> 
#include <iomanip> 
#include <fstream> 

using namespace std; 

void openFiles(ifstream& inFile, ofstream& outFile) 
{ 
inFile.open("finalin.dat"); 
outFile.open("finalout.dat"); 
outFile << fixed << showpoint << setprecision(2); 
inFile >> fixed >> showpoint >> setprecision(2); 
if (!inFile||!outFile) 
{ 
    cout << "Problem opening file."; 
} 
} 
void initialize(int countFemale,int countMale,float sumFemaleGPA,float sumMaleGPA) 
{ 
countFemale=0; 
countMale=0; 
sumFemaleGPA=0; 
sumMaleGPA=0; 
} 
void sumGrades(ifstream& inFile, float sumFemaleGPA, float sumMaleGPA,int m,int f) 
{ 
sumFemaleGPA=0; 
sumMaleGPA=0; 

if (!inFile) 
    { 
     inFile.open("finalin.dat"); 
    } 
char sex; 
float grade;  

while(!inFile.eof()) 
{ 

    inFile >> sex >> grade; 

    switch (sex) 
    { 
    case 'f': (sumFemaleGPA= sumFemaleGPA + grade); 
     f++; 
     break; 
    case 'm': (sumMaleGPA= sumMaleGPA + grade); 
     m++; 
     break; 
    } 
} 
} 
void averageGPA(float avgfGPA, float avgmGPA, int m, int f, float sumFemaleGPA, float sumMaleGPA) 
{ 
avgmGPA=0; 
avgfGPA=0; 

avgfGPA=sumFemaleGPA/f; 
avgmGPA=sumMaleGPA/m; 
} 

void printResults(float avgfGPA, float avgmGPA, ofstream& outFile) 
{ 
     cout <<"The average GPA of the female students is: "<< avgfGPA << endl; 
     cout <<"The average GPA of the male students is: "<< avgmGPA; 

     outFile << "The average GPA of the female students is: "<< avgfGPA << endl; 
     outFile <<"The average GPA of the male students is: "<< avgmGPA; 

} 

     int main() 
{ 

int countFemale; 
int countMale; 
float sumFemaleGPA; 
float sumMaleGPA; 
float avgfGPA; 
float avgmGPA; 

ifstream inFile; 
ofstream outFile; 

openFiles(inFile,outFile); 
initialize(countFemale,countMale,sumFemaleGPA,sumMaleGPA); 
sumGrades(inFile,sumFemaleGPA,sumMaleGPA,countMale,countFemale); 
averageGPA(avgfGPA,avgmGPA,countMale,countFemale,sumFemaleGPA,sumMaleGPA); 
printResults(avgfGPA,avgmGPA, outFile); 


} 

不知道錯誤發生在哪裏,所以我發佈了整個文件。

+0

你爲什麼認爲這些變量是初始化的? – ChaosPandion

回答

1

您的initializeaverageGPA功能不正確。

你想要的功能裏面修改任何參數應該是passed by reference

void initialize(int &countFemale,int &countMale,float &sumFemaleGPA,float &sumMaleGPA) 
void averageGPA(float &avgfGPA, float &avgmGPA, int m, int f, float &sumFemaleGPA, float &sumMaleGPA) 

正因爲如此,在initialize()功能實際上並沒有初始化的變量 - 因此,爲什麼你當你第一次拿到調試錯誤嘗試使用它們。

現在,你在傳遞價值。參數被複制到函數中。然後該函數修改本地副本,而不是傳入的副本。

+0

難道你不認爲他們應該只是初始化他們內聯,但? – ChaosPandion

+0

是的,這也是一個選項。我只是想直接指出問題的根源。 – Mysticial

1

您的初始化函數並非初始化您認爲的內容,因爲正在傳入的參數是按值傳遞的。您需要查看passing by-reference

所以嚴格地說錯誤是因爲這個...

int countFemale; 
int countMale; 
float sumFemaleGPA; 
float sumMaleGPA; 
float avgfGPA; 
float avgmGPA; 

這些變量未初始化任何東西。你可以這樣做

int countFemale = 0; 
int countMale = 0; 
float sumFemaleGPA = 0; 
float sumMaleGPA = 0; 
float avgfGPA = 0; 
float avgmGPA = 0; 

也許是爲了提高你的理解,改變你的初始化函數來德值初始化爲1,並注意值不從0這是因爲你傳遞的拷貝改變變量初始化函數。您想使用&運算符來傳遞對原始變量的引用。