2009-07-03 119 views
2

嗨我有一些编程的经验,但我不是很好的指针。我一直在试图调试我一直在努力的这个程序,但它一直给我一个分段错误。我的代码如下:不知道是什么导致我的分段错误 - C++

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

当我编译的代码,它包括部分运行的程序,但随后在最后我得到了分段错误。但是,如果我将该部分评论为一切运行正常,并且没有分段错误。我不明白常规整数如何导致分段错误。如果有人能够解释我犯了什么错误,我在哪里做了,我将不胜感激。在此先感谢

回答

6

hexpieces是一个长度为120的数组,所以其最大的指数是119你特林访问hexpieces[i]i = 120(这是你的for循环发生在最后一个索引)。既然你没有“拥有”那段记忆,那么你就会得到一个分割失败。

+1

谢谢,我知道这是非常简单的事情。只是不知道到底是什么。 – rhololkeolke 2009-07-03 21:08:46

4

当你定义数组,你整整120个分配存储:

hexagon hexpieces[120]; 

但在你的循环,你遍历索引为0至120,这实际上是121个位置:

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

要么在原始数组中分配121个六角形,要么在回路中使用i<120以避免错误。

0

乍一看:

for(int i = 0; i<120; i++) 
1

你定义 “六边形hexpieces [120];”但使用“for(int i = 0; i < 121; i ++)”。用[120]定义意味着120个元素 - 从0到119的元素。使用超出数组的元素120。所以,你总是在破坏记忆。有时候程序中的某些代码碰巧碰到了这个破坏内存的东西,有时候不会。它取决于代码布局等。像Java,C#等托管语言会陷入这种“越界”的错误。

0

另外,使用STL向量可以避免诸如数组超出边界之类的问题。