2

こんにちは私はプログラミングの経験がありますが、ポインタはあまり得意ではありません。作業中のこのプログラムをデバッグしようとしていますが、セグメンテーション違反が発生し続けます。私のコードは次のとおりです。

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

コードをコンパイルし、そのセクションが含まれていると、プログラムが実行されますが、最後にセグメンテーション違反が発生します。ただし、そのセクションをコメントアウトすると、すべてが正常に実行され、セグメンテーション違反は発生しません。通常の整数がどのようにセグメンテーション違反を引き起こしているのかわかりません。誰かが私が犯した間違いと私が犯した場所を説明してくれたら、私はそれを大いに感謝します。前もって感謝します

4

5 に答える 5

6

hexpiecesは長さ120の配列であるため、最大のインデックスは119です。= 120(ループがとる最後のインデックス)でアクセスしようとしていますhexpieces[i]。あなたはその記憶を「所有」していないので、あなたはセグメンテーションの失敗を得る。ifor

于 2009-07-03T20:01:38.933 に答える
4

アレイを定義するときは、正確に120個のストレージを割り当てます。

hexagon hexpieces[120];

ただし、ループでは、インデックス0から120までを繰り返します。これは、実際には121の場所です。

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

元の配列に121個のhexpiecesを割り当てるかi<120、ループで使用してエラーを回避します。

于 2009-07-03T20:02:50.693 に答える
1

「六角形の六角形[120];」を定義します。ただし、「for(int i = 0; i <121; i ++)」を使用します。[120]で定義すると、120個の要素(0から119までの要素)を意味します。配列を超えた要素120を使用します。だから、あなたはいつもメモリを壊している。プログラム内の一部のコードが、たまたまその破壊されたメモリでつまずく場合もあれば、そうでない場合もあります。コードのレイアウトなどによって異なります。Java、C#などの管理対象言語では、この「範囲外」エラーが検出されます。

于 2009-07-03T20:05:07.180 に答える
0

一目見ただけで:

for(int i = 0; i<120; i++)
于 2009-07-03T20:04:53.297 に答える
0

また、STLベクトルを使用すると、配列が範囲外になるなどの問題を回避できます。

于 2009-07-03T20:49:58.943 に答える