2016-05-13 18 views
0

Ich habe diesen Code, der eine Funktion ist, um die Schritte für eine Perkolationssimulation in einem zweidimensionalen Array durchzuführen.Segmentierungsfehler (Fehler Core Dump)

int step (double ** mat, unsigned n, unsigned m, double a, double b) 
{  
    int i, h, r, c, steps, x, y, o, v;    // search for minimum 
    int min; 
    FILE *fp; 

    for(steps=0; steps<2; steps++) // percolation steps 
    { 
     for (o=0; o<n; o++)                
     { 
      for(v=0; v<m; v++) 
      { 
       if (mat[o][v]==-2) {mat[o][v]=-1;} 
      } 
     }    //trasformo i -2 in -1                 

     min=b;         //set the minimum to max of range 
     for(x=0; x<n; x++)     // i search in the matrix the invaded boxes 
     { 
      for(y=0; y<m; y++) 
      { 
       if (mat[x][y]=-1)   //control for the boxes 
       {        
        if (mat[x][y-1]<=min && mat[x][y-1]>=0) {min=mat[x][y-1]; r=x; c=y-1;}    //look for the minimum adjacent left and right 
        if (mat[x][y+1]<=min && mat[x][y+1]>=0) {min=mat[x][y+1]; r=x; c=y+1;} 
        for (i=-1; i<=1; i++)                //look for the minimum adjacent up and down 
        { 
         for(h=-1; h<=1; h++) 
         { 
          if (mat[(x)+i][(y)+h]<=min && mat[(x)+i][(y)+h]>=0) 
          { 
           min=mat[(x)+i][(y)+h]; 
           r=(x)+i; c=(y)+h; 
          }  
         } 
        } 
       } 
      } 
     } 
     mat[r][c]=-2; 

     x=r; y=c; 
    } 
    return 0; 
} 

Als ich es in meiner main Funktion erhalte ich Segmentation-fault (core dump created). Hast du eine Idee, wo der Fehler ist?

+4

'mat [x] [y-1]' mit 'y = 0 'führt zu undefiniertem Verhalten. Gleiches für 'y = m' und' mat [x] [y + 1] '. Verwenden Sie auch '=' anstelle von '=='. Aktivieren Sie Warnungen in Ihrem Compiler. – Zeta

+4

Nun, das ist ein Spaghetti ... –

+0

BTW 'if (mat [x] [y] = - 1)'? – BLUEPIXY

Antwort

0

Der Segmentierungsfehler (SF) wird generiert, wenn Sie versuchen, auf eine Speicheradresse zuzugreifen, die Ihrem Programm nicht zugewiesen ist. Es gibt einige Fehler in Ihrem Code

if (mat[x][y+1]<=min && mat[x][y+1]>=0) 

Hier wird der Index, wenn y==m-1 außer Reichweite sein. Dies gilt auch für einen anderen Array-Index innerhalb der Schleife

if (mat[x][y]=-1) 

Hier ist ein Schreibfehler, der gleich Vergleichsoperator sollte == sein.

Es ist schwer zu sagen, welcher Teil Ihres Codes für den SF verantwortlich ist. Es wird Ihnen viel Zeit ersparen, einen Debugger zu verwenden und den Fehler zur Laufzeit abzufangen. Sie können dann den Stapel zurückverfolgen und verstehen, was passiert.

0

Der Segmentierungsfehler wird durch die ungültige Speicheradresse verursacht, auf die von Ihrem Programm zugegriffen werden soll.

Ich bemerkte, dass in der Funktion, die Sie zwei for-Schleifen haben,

   for (i=-1; i<=1; i++)                //look for the minimum adjacent up and down 
       { 
        for(h=-1; h<=1; h++) 
        { 
         if (mat[(x)+i][(y)+h]<=min && mat[(x)+i][(y)+h]>=0) 
         { 
          min=mat[(x)+i][(y)+h]; 
          r=(x)+i; c=(y)+h; 
         }  
        } 
       } 

Die Variable 'i' & 'h' beginnen beide von -1, dies führt dazu, dass Sie die Matte für den Zugriff auf [-1] [-1] am Anfang, was keine gültige Speicheradresse für das Programm ist.

Sie sollten Ihre Schleifen neu entwerfen, um zu vermeiden, dass die Grenze Ihres Arrays überschritten wird.