سؤال

ومرحبا لدي بعض الخبرة في البرمجة ولكن أنا لست جيدة جدا مع مؤشرات. لقد كنت تحاول تصحيح هذا البرنامج لقد تم العمل على لكنه يبقي إعطائي خطأ تجزئة. قانون بلدي هو ما يلي:

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

عند I ترجمة التعليمات البرمجية ويشمل هذا القسم تشغيله البرنامج ولكن بعد ذلك في نهاية أحصل على خطأ تجزئة. ومع ذلك، إذا كنت التعليق خارج هذا القسم كل شيء يسير على ما يرام وليس هناك خطأ تجزئة. أنا لا أفهم كيف يمكن لعدد صحيح منتظمة يمكن أن تسبب خطأ تجزئة. اذا كان شخص ما يمكن أن يفسر ما الخطأ الذي أدليت به وأين أنا جعلت أنا في غاية الامتنان. شكرا مقدما

هل كانت مفيدة؟

المحلول

وhexpieces هو مجموعة من طول 120، لذلك أكبر مؤشره هو 119. أنت ترينغ للوصول hexpieces[i] مع i = 120 (وهذا مؤشر آخر حلقة for الخاص يأخذ على). منذ كنت لا "الخاصة" التي الذاكرة، وتحصل على falut لتجزئة.

نصائح أخرى

وعند تعريف مجموعة الخاصة بك، وأنت تخصيص لتخزين بالضبط 120 قطعة:

hexagon hexpieces[120];

ولكن في حلقة الخاص بك، يمكنك تكرار عبر المؤشرات من 0 إلى 120، الذي هو في الواقع 121 المواقع:

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

وإما تخصيص 121 hexpieces في مجموعة في الأصل، أو استخدام i<120 في حلقة لتجنب الخطأ.

ويمكنك تحديد "hexpieces مسدس [120]." ولكن استخدام "ل(كثافة العمليات ط = 0؛ ط <121؛ ط ++)". تحديد مع [120] يعني 120 العناصر - تلك من 0 إلى 119. يمكنك استخدام العنصر 120، الذي هو أبعد من مجموعة. لذا، كنت دائما clobbering الذاكرة. أحيانا بعض التعليمات البرمجية في برنامجك يحدث أن تعثر على تلك الذاكرة مضروب، وأحيانا لا. ان ذلك يعتمد على تخطيط قانون، وما إلى لغة تدار مثل جافا، C #، وما إلى ذلك قد اشتعلت هذه "خارج الحدود" خطأ.

وكذلك استخدام ناقلات STL يمكن تجنب مشاكل مثل المصفوفات الخروج من الحدود.

للوهلة الأولى:

for(int i = 0; i<120; i++)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top