2014-10-17 11 views
11

ho questo codice:Interruzione trap 6 errore in C

void drawInitialNim(int num1, int num2, int num3) 
{ 
    int board[2][50]; //make an array with 3 columns 
    int i; // i, j, k are loop counters 
    int j; 
    int k; 

    for(i=0;i<num1+1;i++)  //fill the array with rocks, or 'O' 
     board[0][i] = 'O';  //for example, if num1 is 5, fill the first row with 5 rocks 
    for (i=0; i<num2+1; i++) 
     board[1][i] = 'O'; 
    for (i=0; i<num3+1; i++) 
     board[2][i] = 'O'; 

    for (j=0; j<2;j++) {  //print the array 
     for (k=0; k<50;k++) { 
     printf("%d",board[j][k]); 
     } 
    } 
    return; 
} 

int main() 
{ 
    int numRock1,numRock2,numRock3; 
    numRock1 = 0; 
    numRock2 = 0; 
    numRock3 = 0; 
    printf("Welcome to Nim!\n"); 
    printf("Enter the number of rocks in each row: "); 
    scanf("%d %d %d", &numRock1, &numRock2, &numRock3); 
    drawInitialNim(numRock1, numRock2, numRock3); //call the function 

    return 0; 
} 

Quando compilo questo con gcc, va bene. Quando eseguo il file, ottengo l'errore di interruzione trap 6 dopo aver inserito i valori.

Ho visto altri post su questo errore e non mi aiutano.

+2

'int bordo [2] [50];' - > 'int board [3] [50];' – BLUEPIXY

+0

Ma anche in questo caso, 50 è un numero magico che potrebbe traboccare. – 5gon12eder

risposta

2

Prova questa:

void drawInitialNim(int num1, int num2, int num3){ 
    int board[3][50] = {0}; // This is a local variable. It is not possible to use it after returning from this function. 

    int i, j, k; 

    for(i=0; i<num1; i++) 
     board[0][i] = 'O'; 
    for(i=0; i<num2; i++) 
     board[1][i] = 'O'; 
    for(i=0; i<num3; i++) 
     board[2][i] = 'O'; 

    for (j=0; j<3;j++) { 
     for (k=0; k<50; k++) { 
      if(board[j][k] != 0) 
       printf("%c", board[j][k]); 
     } 
     printf("\n"); 
    } 
} 
+0

Grazie mille! Funziona! – user1753491

18

Si sta scrivendo per la memoria che non si possiede:

int board[2][50]; //make an array with 3 columns (wrong) 
        //(actually makes an array with only two 'columns') 
... 
for (i=0; i<num3+1; i++) 
    board[2][i] = 'O'; 
     ^

Modifica questa linea:

int board[2][50]; //array with 2 columns (legal indices [0-1][0-49]) 
     ^

A:

int board[3][50]; //array with 3 columns (legal indices [0-2][0-49]) 
     ^

Durante la creazione di un array, il valore utilizzato per initialize [3] indica la dimensione dell'array.
Quando si accede alla matrice esistente, i valori dell'indice sono basati su zero.

Per un array creato: int board[3][50];
indici legali sono bordo [0] [0] ... tavola [2] [49]

EDIT Per affrontare commento cattivo uscita e l'inizializzazione commento

aggiungere un ulteriore "\ n" per l'uscita di formattazione:

Cambio:

... 
    for (k=0; k<50;k++) { 
    printf("%d",board[j][k]); 
    } 
} 

     ... 

A:

... 
    for (k=0; k<50;k++) { 
    printf("%d",board[j][k]); 
    } 
    printf("\n");//at the end of every row, print a new line 
} 
... 
variabile

inizializzazione bordo:

int board[3][50] = {{0}};//initialize all elements of 2d array to zero 
+0

Sì, ha corretto l'errore, ryyker. Grazie! – user1753491

+0

@ user1753491 - anche, la scheda è un array intero, quando si effettuano assegnamenti, non dovresti popolarli con zeri invece di "O"? ('board [2] [i] = 'O';' dovrebbe essere 'board [2] [i] = 0;') – ryyker

+0

@ryyker Voglio renderli un O per il mio programma. Pensavo di poterlo fare in qualche modo con i codici ASCII. Sai cosa intendo? Non voglio occuparmi di array di carbone. – user1753491