【问题标题】:Debug error! Run-Time Check Failure #3调试错误!运行时检查失败 #3
【发布时间】:2011-12-08 03:02:24
【问题描述】:

我在运行程序时收到此错误。它编译成功,但给了我一些关于未初始化变量的警告,我认为这些变量已经初始化。我收到错误消息“调试错误!运行时检查失败 #3 - 变量 'sumMaleGPA' 正在使用而未初始化。”

#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);


}

不确定错误发生在哪里,所以我发布了整个文件。

【问题讨论】:

  • 你认为变量为什么会被初始化?

标签: c++ visual-studio-2010


【解决方案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() 函数实际上并没有初始化变量 - 因此当您第一次尝试使用它们时会出现调试错误。

现在,您正在按价值传递。参数被复制到函数中。然后该函数会修改本地副本而不是传入的副本。

【讨论】:

  • 你不认为他们应该内联初始化它们吗?
  • 是的,这也是一个选项。我只是想直接指出问题的根源。
【解决方案2】:

您的初始化函数并没有像您认为的那样初始化,因为您传入的参数是按值传递的。您需要查看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 更改。这是因为您将变量的副本传递给初始化函数。您想使用 &amp; 运算符传入对原始变量的引用。

【讨论】:

    猜你喜欢
    • 2011-02-25
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-26
    • 1970-01-01
    相关资源
    最近更新 更多