2009-07-03 5 views
2

Hallo Ich habe etwas Erfahrung mit der Programmierung, aber ich bin nicht sehr gut mit Zeigern. Ich habe versucht, dieses Programm zu debuggen, an dem ich gearbeitet habe, aber es gibt mir immer einen Segmentierungsfehler. Mein Code ist folgende:Nicht sicher, was meinen Segmentierungsfehler verursacht - C++

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

Wenn ich kompilieren Sie den Code und es enthält dieser Abschnitt es das Programm läuft, aber dann an:

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

Mein Problem mit dem folgenden Teil des Codes zu sein scheint Am Ende bekomme ich einen Segmentierungsfehler. Wenn ich jedoch diesen Abschnitt auskommentiere, läuft alles gut und es gibt keinen Segmentierungsfehler. Ich verstehe nicht, wie eine reguläre ganze Zahl einen Segmentierungsfehler verursachen könnte. Wenn jemand erklären könnte, welchen Fehler ich gemacht habe und wo ich ihn gemacht habe, würde ich das sehr schätzen. Vielen Dank im Voraus

Antwort

6

hexpieces ist ein Array mit einer Länge von 120, so dass ihr größten Index 119. Sie ist Tring zugreifen hexpieces[i] mit i = 120 (das ist der letzte Index Ihrer for Schleife übernimmt). Da Sie diese Erinnerung nicht "besitzen", erhalten Sie eine Segmentierung falut.

+1

Dank Ich wusste, es war etwas wirklich einfaches. Ich wusste einfach nicht genau was es war. – rhololkeolke

4

Wenn Sie Ihr Array definieren, werden Zuteilen Sie Speicher für genau 120 Teile:

hexagon hexpieces[120]; 

Aber in der Schleife, durchlaufen sie über Indizes 0 bis 120, die tatsächlich 121 Standorten ist:

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

Ordnen Sie im ursprünglichen Array entweder 121 Hex-Stücke zu, oder verwenden Sie i<120 in der Schleife, um den Fehler zu vermeiden.

0

Auf den ersten Blick:

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

Sie definieren "Sechseck hexpieces [120];" aber verwende "für (int i = 0; i < 121; i ++)". Definieren mit [120] bedeutet 120 Elemente - diejenigen von 0 bis 119. Sie verwenden Element 120, das sich außerhalb des Arrays befindet. Du bist also immer an der Erinnerung ratlos. Manchmal stolpert etwas Code in Ihrem Programm über diese gequälte Erinnerung, manchmal nicht. Dies hängt vom Code-Layout usw. ab. Eine verwaltete Sprache wie Java, C#, usw. hätte diesen "Out of Bounds" -Fehler erfasst.

0

Auch die Verwendung eines STL-Vektors kann Probleme vermeiden, wie z. B. das Verlassen von Arrays.

Verwandte Themen