-1

我正在为我的班级创建一个滑冰程序,并且在运行时遇到错误消息。当编译器尝试在 Judge 函数中添加性能和技术分数时,就会发生这种情况。任何帮助将不胜感激,如果需要任何澄清,请告诉我!

编辑:错误消息是 “ IceSkating1.exe 中 0x00FE4686 的第一次机会异常:0xC0000005:访问冲突读取位置 0xCDCCDCDD5。” 和“ IceSkating1.exe 中 0x00FE4686 处的未处理异常:0xC0000005:访问冲突读取位置 0xCDCCDCDD5。”

#include <iostream>
#include <iomanip>
using namespace std;

typedef int *intptr;

class Judge
{
private:
    int performance, technical, total = 0;

public:
    void SetPerformance(int a) { performance = a; }
    void SetTechnical(int a) { technical = a; }
    void SetTotal() { total = performance + technical;} //EXCEPTION OCCURS HERE
    int GetTotal() { return total; }
};

class Skater
{
private:
    int ID;
    Judge* judges;
    int *ranks;

public:
    void SetID()
    {
        int t;
        cout << "Please enter skater ID: ";
        cin >> t;
        ID = t;
    }

    int GetID()
    {
        return ID;
     }

    void Judges(int qnty)
    {
        int p, t;
        judges = new Judge[qnty];


        for (int count = 0; count < qnty; count++)
        {
            cout << "Please enter the peformance score from judge " << count + 1 << ":";
            cin >> p;
            while ((p > 6) || (p < 0))
        {
            cout << "Invalid score.  Please enter a value between 0 - 6. \n";
            cin >> p;
        }

        judges[qnty].SetPerformance(p);


        cout << "Please enter the technical score from judge " << count + 1 << ":";
        cin >> t;

        while ((t > 6) || (t < 0))
        {
            cout << "Invalid score.  Please enter a value between 0 - 6. \n";
            cin >> t;
        }

        judges[qnty].SetTechnical(t);

    }
}

int GetJudgeTotal(int judgeqnty)
{
    return judges[judgeqnty].GetTotal();
}

void SetRank(int judgeqnty, int rank)
{
    ranks = new int[judgeqnty];
    rank = ranks[judgeqnty];
}

int GetRank(int judgeqnty)
{
    return ranks[judgeqnty];
}
};


int main()
{
Skater* s;
int skaterqnty, judgeqnty;

cout << "Please enter number of contestants: ";
cin >> skaterqnty;

while ((skaterqnty > 24) || (skaterqnty < 0))
{
    cout << "Please enter a valid amount. \n";
    cin >> skaterqnty;
}

s = new Skater[skaterqnty];

for (int count = 0; count < skaterqnty; count++) {
    s[count].SetID();
}


cout << "Please enter odd number of judges: ";
cin >> judgeqnty;
if ((judgeqnty % 2) == 0 || (judgeqnty > 11))
{
    cout << "Please enter valid number of judges. \n";
    cin >> judgeqnty;
}

for (int count = 0; count < skaterqnty; count++)
{
    cout << "Please enter scores for skater " << s[count].GetID() << ": \n";
    s[skaterqnty].Judges(judgeqnty);
}

cout << s[0].GetJudgeTotal(0);

/*int jTotals[judgeqnty][skaterqnty];

for (int column = 0; column < skaterqnty; column++){
for (int row = 0; row < judgeqnty; row++){
jTotals[row][column] = s[column].JudgeTotal(judgeqnty);
}
}*/

cout << "---Beginning rank sort---\n";
for (int m = 0; m < judgeqnty; m++) {
int _rank = 1; cout << "---First level of loop\n";
for (int n = 0; n < skaterqnty; n++) { cout << "---Second level \n";
for (int p = 0; p < skaterqnty; p++) { cout << "---Third level \n";
if (s[n].GetJudgeTotal(m) < s[p].GetJudgeTotal(m))
{
_rank++;
cout << "Control statement completed\n";
}
} cout << "End third level\n";
s[n].SetRank(m, _rank); cout << "End second level\n";
} cout << "First level completed. \n";
}

for (int a = 0; a < skaterqnty; a++){
    for (int b = 0; b < judgeqnty; b++)
    {
        cout << "Current Ranking:\nSkater " << s[a].GetID() << ":\t" << s[a].GetRank(b) << "\t";
    }
}

cout << "\nDONE.";

}
4

2 回答 2

3

您分配一个大小数组qnty

    judges = new Judge[qnty];

然后尝试访问qnty-th 元素:

    judges[qnty].SetPerformance(p);
    judges[qnty].SetTechnical(t);

这是未定义的行为(元素从0到编号qnty-1)。

你的意思是写judges[count]吗?

于 2014-11-08T22:53:42.520 回答
0

您更新了错误法官的分数。你正在做:

judges[qnty].SetPerformance(p);

但是您正在循环执行此操作,因此您的意思可能是:

judges[count].SetPerformance(p);
于 2014-11-08T22:56:22.830 回答