调试器有正确的输出但正常执行没有

如何解决调试器有正确的输出但正常执行没有

我遇到了一个奇怪的问题,当我通过调试器运行它时,我的代码完全按照我的意愿运行,但是当我正常运行它时它不起作用。奇怪的是我也没有收到运行时错误。这就是问题所在,但我不是 100% 确定:

void calcMostMissed (double *ptr,int totalContestants,int arrSize)
{
    //output header
    cout << endl << "MOST MISSED QUESTIONS" << endl;

    //check how many times a question is missed and its percentage,then output it if it's above 60%
    double curQuest = *ptr;
    int freq = 0;
    int j = 0;
    double percentMissed;
    for (int i = 0; i <= arrSize; i++)     //loop through the missed questions array
    {
        if (*(ptr + i) > 0)      //if pointer is pointing at a question number (extra space in array is set to 0)...
        {
            if (*(ptr + i) == curQuest)      //then check how often it occurs in the array
            freq++;
        }
        else    //if the pointer is not pointing at a question number anymore...
        {
            //calculate percent missed and output it if its 60% or greater
            percentMissed = (static_cast<double>(freq) / totalContestants) * 100;
            if (percentMissed >= 60)
            {
                cout << static_cast<int>(curQuest) << "\t" << fixed << setprecision(2) << percentMissed << "%" << endl;
            }
            // check if the question's percentage missed has already been calculated and evaluated
            j++;
            curQuest = *(ptr + j);
            int r = 0;
            while (r < j)
            {
                if (*(ptr + r) == curQuest)
                {
                    if (j < arrSize - 1)
                    {
                        j++;
                        curQuest = *(ptr + j);
                    }
                }
                r++;
            }
            if (!(j == arrSize - 1 && r == arrSize - 1))
            {
                i = 0;
            }
            freq = 0;
        }
        //if the current question variable has been through all missed question,then leave loop
        if (curQuest < 1)
        {
            break;
        }
    }
}

这个函数的总体作用是找出所有漏掉问题的百分比,并只输出超过 60% 的问题。

这是我的调试器输出内容(以及我想要的样子):

Enter name of answer key file: batch7a.txt
Enter name of contestant's answers file: allWrongContestants.txt
oo12345678 - 0.00
1 2 3
C A B
A B C

0012387654 - 0.00
1 2 3
C A B
A B C

0012364213 - 0.00
1 2 3
C A B
A B C

Mean: 0.00
Median: 0.00
Mode: 0.00

MOST MISSED QUESTIONS
1       100.00%
2       100.00%
3       100.00%

这是正常执行的输出

Enter name of answer key file: batch7a.txt
Enter name of contestant's answers file: allWrongContestants.txt
oo12345678 - 0.00
1 2 3
C A B
A B C

0012387654 - 0.00
1 2 3
C A B
A B C

0012364213 - 0.00
1 2 3
C A B
A B C

Mean: 0.00
Median: 0.00
Mode: 0.00

MOST MISSED QUESTIONS

Process returned 0 (0x0)   execution time : 14.442 s
Press any key to continue.

我的调试器一直运行到我的程序结束就好了,但由于某种原因,正常执行仍然存在缺陷。欢迎提出任何建议,我会澄清我可能忘记提及的任何内容

如果有帮助,我使用 Code::Blocks 作为我的 IDE

关于我的代码的一些其他信息:有 3 个问题,所有参赛者在测试中的得分为 0%,这意味着所有问题都有不正确的答案。

输出:数字是参赛者的ID,旁边是他们的分数,下面的数字列表是他们错的问题编号,下面是参赛者的答案,下面是正确答案。

这是调用 calcMostMissed 函数函数

void statReport (double *ptr,int totalscores,double *mmqPtr,int arrSize)
{
    //calculate mean of scores
    double mean = calcmean(ptr,totalscores);

    //calculate median of scores
    double median = calcmedian(ptr,totalscores);

    //calculate mode of scores
    double *mode = calcMode(ptr,totalscores);

    //output to console the data
    cout << "Mean: " << fixed << setprecision(2) << mean << endl;
    cout << "Median: " << median << endl;
    cout << "Mode: ";
    sort(mode,mode + totalscores);
    int j = 0;
    for (int i = 0; i < totalscores; i++)
    {
        if (*(mode + i) != -1)
        {
            if (j == 0)
            {
                cout << *(mode + i);
            }
            else
            {
                cout << "," << *(mode + i);
            }
            j++;
        }
    }
    cout << endl;

    //call calcMissedQuestions function
    calcMostMissed(mmqPtr,totalscores,arrSize);

    //delete pointers
    delete[] mode;
    mode = nullptr;
    delete[] mmqPtr;
    mmqPtr = nullptr;
}

这是主要功能

int main()
{
    string answerKeyName;
    string contestantAnswerName;
    ifstream answerKeyFile;
    ifstream contestantAnswerFile;

    //ask for file names
    cout << "Enter name of answer key file: ";
    cin >> answerKeyName;
    cout << "Enter name of contestant's answers file: ";
    cin >> contestantAnswerName;

    //check if files can be opened properly
    answerKeyFile.open(answerKeyName,ios::binary);
    contestantAnswerFile.open(contestantAnswerName,ios::binary);
    if(!answerKeyFile)
    {
        cout << "Answer key file Could not be opened" << endl;
        exit(EXIT_FAILURE);
    }
    if (!contestantAnswerFile)
    {
        cout << "Contestant's answers file Could not be opened" << endl;
        exit(EXIT_FAILURE);
    }

    //find how many contestant's there are
    int i = 0;
    string temp;
    while (contestantAnswerFile.good())
    {
        getline(contestantAnswerFile,temp);
        if (temp != "")
        {
            i++;
        }
    }
    contestantAnswerFile.clear();
    contestantAnswerFile.seekg(0,ios::beg);

    //create contestant's score array
    double *scorePtr = new double[i];

    //create pointer for all missed questions
    double *mmqPtr = nullptr;
    int arrSize;

    //compare the contestant's answers to the answer key,then fill array with score
    double score;
    for (int c = 0; c < i; c++)
    {
        score = compareAnswers (contestantAnswerFile,answerKeyFile,mmqPtr,i,arrSize);
        *(scorePtr + c) = score;
    }

    //create the statistics report
    statReport(scorePtr,arrSize);

    //delete dynamically allocated array
    delete[] scorePtr;
    scorePtr = nullptr;

    //close files
    answerKeyFile.close();
    contestantAnswerFile.close();

    return 0;
}

解决方法

下面是我认为问题所在的地方,但是我仍然无法正确编译它,因为没有提供其他功能和输入文件,可能是正确的,以免进一步使问题变得拥挤:

double *mmqPtr = nullptr;main() 中定义,然后它被传递给 statReport() 函数,而没有与任何对象相关联。 之后它充当函数 calcMostMissed() 的第一个参数并在其中被取消引用,但仍然是 nullptr,因此这会产生未定义的行为。

正如评论中指出的那样,循环内还有一个越界索引的问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?