Как исправить ошибку сегментации в этом коде? - PullRequest
0 голосов
/ 20 мая 2019

Мне очень жаль, если это слишком глупо, но я только начинаю с c и кодирования в целом. Мне также жаль, что это по-испански, я надеюсь, что это не слишком запутанно. Я пытаюсь написать настольную игру, используя матрицу, и на данный момент я просто хочу напечатать доску. Я пытался использовать Eclipse, но продолжал получать ошибки, такие как ошибка с версией command-gdb. Я также попытался запустить его на онлайн-компиляторах Си, но безуспешно (в этом случае я получаю ошибку сегментации).

#include <stdio.h>
#include <stdlib.h>
char *tablero[9][9];
char Rey = 'R';
char gralOro = 'O';
char gralPlata = 'P';
char caballos = 'C';
char lanceros = 'L';
char alfil = 'A';
char torre = 'T';
char peones = 'p';
char vacio = ' ';
char *piezasNegrasPerdidas[20];
char *piezasBlancasPerdidas[20];
void initBoard(){
    for(int i = 0; i<0; i++){
        for(int j = 0; j<9; j++){
            if(i==2 || i==6){
                tablero[i][j] = &peones;
                }
            else if(i==3 || i==4 || i==5){
                tablero[i][j]=&vacio;
            }
        }
    }
    tablero[0][0] = &lanceros;
    tablero[0][1] = &caballos;
    tablero[0][2] = &gralPlata;
    tablero[0][3] = &gralOro;
    tablero[0][4] = &Rey;
    tablero[0][5] = &gralOro;
    tablero[0][6] = &gralPlata;
    tablero[0][7] = &caballos;
    tablero[0][8] = &lanceros;
    tablero[1][1] = &alfil;
    tablero[1][7] = &torre;


    tablero[8][0] = &lanceros;
    tablero[8][1] = &caballos;
    tablero[8][2] = &gralPlata;
    tablero[8][3] = &gralOro;
    tablero[8][4] = &Rey;
    tablero[8][5] = &gralOro;
    tablero[8][6] = &gralPlata;
    tablero[8][7] = &caballos;
    tablero[8][8] = &lanceros;
    tablero[7][1] = &alfil;
    tablero[7][7] = &torre;

}
void printTablero(){
    for (int r = 0; r < 9; r++){
        for(int c = 0; c<9; c++){
            printf("[%c]", *(tablero[r][c]));
        }
        printf("\n");

    }
}
int main(){
    printTablero();
    return 0;
}

Я ожидаю, что смогу запустить этот код, но я немного не понимаю, что может быть не так даже после некоторых исследований.

Ответы [ 2 ]

1 голос
/ 20 мая 2019

Хотя это можно сделать с помощью двумерного массива указателей, указывающих на символы, я бы не рекомендовал это делать.Вместо этого просто создайте двумерный массив символов:

char tablero[9][9]; // without the *

Затем измените инициализацию следующим образом:

tablero[0][0] = lanceros; // without the &

И выведите следующее:

printf("[%c]", tablero[r][c]);

Кроме того, ваш цикл for (int i = 0; i < 0; i++) никогда не запускается.Измените его, чтобы вместо этого правильно инициализировать все поля.Я предполагаю, что вы хотите вложенный цикл, который устанавливает все поля на vacio здесь.Кроме того, вы нигде не звоните initBoard.Я предполагаю, что он был предназначен для вызова в main перед вызовом printTablero.


В конце концов, ошибка сегментации произошла, потому что вы пытаетесь разыменовать указатель, который не был инициализирован, когдаВы распечатали массив (так как initBoard не вызывается, ничего не инициализировано), что привело к неопределенному поведению.

0 голосов
/ 20 мая 2019

Вы не делали инициализацию для каждой ячейки всей доски. Вам нужно просто инициализировать их, т.е. vacio, и после этого установить что-то другое в ячейки.

#include <stdio.h>
#include <stdlib.h>
char * tablero[9][9];
char Rey = 'R';
char gralOro = 'O';
char gralPlata = 'P';
char caballos = 'C';
char lanceros = 'L';
char alfil = 'A';
char torre = 'T';
char peones = 'p';
char vacio = ' ';
char *piezasNegrasPerdidas[20];
char *piezasBlancasPerdidas[20];
void initBoard(){

    for(int i = 0; i<9; i++){
        for(int j = 0; j<9; j++){
            if(i==2 || i==6){
                tablero[i][j] = &peones;
                }
            else {
                tablero[i][j]=&vacio;
            }
        }
    }
    tablero[0][0] = &lanceros;
    tablero[0][1] = &caballos;
    tablero[0][2] = &gralPlata;
    tablero[0][3] = &gralOro;
    tablero[0][4] = &Rey;
    tablero[0][5] = &gralOro;
    tablero[0][6] = &gralPlata;
    tablero[0][7] = &caballos;
    tablero[0][8] = &lanceros;
    tablero[1][1] = &alfil;
    tablero[1][7] = &torre;


    tablero[8][0] = &lanceros;
    tablero[8][1] = &caballos;
    tablero[8][2] = &gralPlata;
    tablero[8][3] = &gralOro;
    tablero[8][4] = &Rey;
    tablero[8][5] = &gralOro;
    tablero[8][6] = &gralPlata;
    tablero[8][7] = &caballos;
    tablero[8][8] = &lanceros;
    tablero[7][1] = &alfil;
    tablero[7][7] = &torre;

}
void printTablero(){
    for (int r = 0; r < 9; r++){
        for(int c = 0; c<9; c++){
            printf("[%c]", *(tablero[r][c]));
        }
        printf("\n");

    }
}
int main(){
    initBoard();
    printTablero();
    return 0;
}

выход

[L][C][P][O][R][O][P][C][L]
[ ][A][ ][ ][ ][ ][ ][T][ ]
[p][p][p][p][p][p][p][p][p]
[ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ]
[p][p][p][p][p][p][p][p][p]
[ ][A][ ][ ][ ][ ][ ][T][ ]
[L][C][P][O][R][O][P][C][L]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...