嗨我有一些编程经验,但我对指针不是很好。我一直在尝试调试我一直在研究的这个程序,但它一直给我一个分段错误。我的代码如下:
#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);
}
当我编译代码并且它包含该部分时,它运行程序但最后我得到了分段错误。但是,如果我注释掉那部分一切正常,并且没有分段错误。我不明白常规整数如何导致分段错误。如果有人能解释我犯了什么错误以及我做了什么,我会非常感激。提前致谢
答案 0 :(得分:6)
hexpieces
是一个长度为120的数组,所以它的最大索引是119.你想要hexpieces[i]
= 120来访问i
(这是你{{1}的最后一个索引循环接受)。既然你没有“拥有”那段记忆,你就会得到一个分段。
答案 1 :(得分:4)
定义阵列时,您正在为120件分配存储空间:
hexagon hexpieces[120];
但是在你的循环中,你迭代索引0到120,实际上是121个位置:
for(int i = 0; i<121; i++)
{
//...
}
在原始数组中分配121个hexpieces,或在循环中使用i<120
以避免错误。
答案 2 :(得分:1)
你定义“hexagon hexpieces [120];”但是使用“for(int i = 0; i&lt; 121; i ++)”。使用[120]定义意味着120个元素 - 从0到119的元素。使用元素120,它超出了数组。所以,你总是在打破记忆。有时程序中的某些代码碰巧偶然发现了破坏的内存,有时却没有。这取决于代码布局等。像Java,C#等托管语言会发现这种“越界”错误。
答案 3 :(得分:0)
乍一看:
for(int i = 0; i<120; i++)
答案 4 :(得分:0)
此外,使用STL向量可以避免数组超出界限等问题。