문제

안녕하세요 저는 프로그래밍 경험이 있지만 포인터에는 능숙하지 않습니다.저는 제가 작업하고 있는 이 프로그램을 디버깅하려고 노력했지만 계속해서 분할 오류가 발생했습니다.내 코드는 다음과 같습니다

#include <iostream>

using namespace std;

class hexagon
{
public:
    hexagon();
    ~hexagon();
    void setSide(int side, hexagon *hexpiece);
    hexagon* getSide(int side);

    void setPos(int x, int y);
    int getX();
    int getY();

    void setID(int id);
    int getID();
private:
    hexagon *side0, *side1, *side2, *side3, *side4, *side5;
    int itsid, itsx, itsy;
};

hexagon::hexagon()
{
    side0 = NULL;
    side1 = NULL;
    side2 = NULL;
    side3 = NULL;
    side4 = NULL;
    side5 = NULL;
}

hexagon::~hexagon()
{
}

void hexagon::setSide(int side, hexagon *hexpiece)
{
    switch(side)
    {
        case 0:
            side0 = hexpiece;
            break;
        case 1:
            side1 = hexpiece;
            break;
        case 2:
            side2 = hexpiece;
            break;
        case 3:
            side3 = hexpiece;
            break;
        case 4:
            side4 = hexpiece;
            break;
        case 5:
            side5 = hexpiece;
            break;
        default:
            cout << "ERROR: Invalid side passed as argument" << endl;
            break;
    }
}

hexagon* hexagon::getSide(int side)
{
    switch(side)
    {
        case 0:
            return side0;
            break;
        case 1:
            return side1;
            break;
        case 2:
            return side2;
            break;
        case 3:
            return side3;
            break;
        case 4:
            return side4;
            break;
        case 5:
            return side5;
            break;
        default:
            cout << "EROR: Invalide side passed as argument" << endl;
            cout << "Returning side0 by default" << endl;
            return side0;
            break;
    }
}

void hexagon::setPos(int x, int y)
{
    itsx = x;
    itsy = y;
}

int hexagon::getX()
{
    return itsx;
}

int hexagon::getY()
{
    return itsy;
}

void hexagon::setID(int id)
{
    itsid = id;
}

int hexagon::getID()
{
    return itsid;
}

int main()
{
    hexagon hexpieces[120];
    int tempx, tempy;
    tempx = 0;
    tempy = 0;

    for(int i = 0; i<121; i++)
    {
        if(i%11 == 0)
        {
            tempx = 7*(i/11);
            tempy = 12*(i/11);
        }
        else
        {
            tempx = tempx + 14;
        }
        cout << "Setting hexpiece" << i << " x to " << tempx << " and y to " << tempy << endl;
        hexpieces[i].setPos(tempx, tempy);
    }

    for(int i=0; i<121; i++)
    {
        cout << "Setting hexpiece" << i << " id" << endl;
        hexpieces[i].setID(i);
        for(int j = 0;j<6; j++)
        {
            cout << "Setting hexpiece" << i << " side" << j << endl;
            if(j == 0 && i > 10 && i % 11 != 10)
            {
                hexpieces[i].setSide(j,&(hexpieces[i-10]));
            }
            else if(j == 1 && i % 11 != 10)
            {
                hexpieces[i].setSide(j,&(hexpieces[i+1]));
            }
            else if(j == 2 && i < 110)
            {
                hexpieces[i].setSide(j,&(hexpieces[i+11]));
            }
            else if(j == 3 && i % 11 != 0 && i < 110)
            {
                hexpieces[i].setSide(j,&(hexpieces[i+10]));
            }
            else if(j == 4 && i % 11 != 0)
            {
                hexpieces[i].setSide(j,&(hexpieces[i-1]));
            }
            else if(j == 5 && i > 10)
            {
                hexpieces[i].setSide(j,&(hexpieces[i-11]));
            }
        }
    }

    hexagon *itr1;
    itr1 = hexpieces;   
    cout << "Hexpiece" << itr1->getID() << " side1 is connected to Hexpiece";
    itr1 = itr1->getSide(1);
    cout << itr1->getID() << endl;
    cout << "Hexpiece" << itr1->getID() << " side2 is connected to Hexpiece";
    itr1 = itr1->getSide(2);
    cout << itr1->getID() << endl;
    cout << "Hexpiece" << itr1->getID() << " side4 is connected to Hexpiece";
    itr1 = itr1->getSide(4);
    cout << itr1->getID() << endl;

    return 0;
}

내 문제는 코드의 다음 부분에 있는 것 같습니다.

int tempx, tempy;
tempx = 0;
tempy = 0;

for(int i = 0; i<121; i++)
{
    if(i%11 == 0)
    {
        tempx = 7*(i/11);
        tempy = 12*(i/11);
    }
    else
    {
        tempx = tempx + 14;
    }
    cout << "Setting hexpiece" << i << " x to " << tempx << " and y to " << tempy << endl;
    hexpieces[i].setPos(tempx, tempy);
}

코드를 컴파일하고 해당 섹션이 포함되면 프로그램이 실행되지만 마지막에는 분할 오류가 발생합니다.그러나 해당 섹션을 주석 처리하면 모든 것이 잘 실행되고 분할 오류가 없습니다.일반 정수가 어떻게 분할 오류를 일으킬 수 있는지 이해하지 못합니다.누군가 내가 어떤 실수를 했는지, 어디서 실수를 했는지 설명해 주시면 정말 감사하겠습니다.미리 감사드립니다

도움이 되었습니까?

해결책

hexpieces 길이가 120인 배열이므로 가장 큰 인덱스는 119입니다.액세스하려고 합니다. hexpieces[i] ~와 함께 i = 120(이것이 마지막 인덱스입니다. for 루프가 발생합니다).해당 메모리를 "소유"하지 않기 때문에 분할 오류가 발생합니다.

다른 팁

어레이를 정의하면 정확히 120개에 대한 스토리지가 할당됩니다.

hexagon hexpieces[120];

그러나 루프에서는 인덱스 0부터 120까지 반복하며 실제로는 121개 위치입니다.

for(int i = 0; i<121; i++)
{
    //...
}

원래 배열에 121개의 육각 조각을 할당하거나 다음을 사용하십시오. i<120 오류를 피하기 위해 루프에서.

당신은 "육각형 육각형 [120];"를 정의합니다. 그러나 "int i = 0;나는<121;나++)".[120]으로 정의한다는 것은 0에서 119까지의 120개 요소를 의미합니다.배열 너머에 있는 요소 120을 사용합니다.그래서, 당신은 항상 기억을 방해하고 있습니다.프로그램의 일부 코드가 손상된 메모리에 걸려 넘어지는 경우도 있지만 그렇지 않은 경우도 있습니다.코드 레이아웃 등에 따라 다릅니다.Java, C# 등과 같은 관리 언어입니다.이 "범위를 벗어난" 오류를 발견했을 것입니다.

또한 STL 벡터를 사용하면 배열이 범위를 벗어나는 등의 문제를 피할 수 있습니다.

첫눈에:

for(int i = 0; i<120; i++)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top