es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

asignación de una matriz bidimensional de caracteres en C

Tengo una estructura que contiene una cuadrícula, es decir, una matriz bidimensional de caracteres, porque necesito simular un juego en el que cada jugador puede colocar ‘o’ o ‘x’ en cada celda.
Mi estructura es la siguiente (la implementé siguiendo una respuesta en este sitio web):

struct game {
    char **grid;
};

Ahora, en mi función create_game, intenté implementarlo de la siguiente manera:

struct game *create(int columns, int rows)
{
    struct game *new_game = malloc(sizeof(struct game));
    if (new_game)
    {
        new_game->grid = malloc(sizeof(char *) * rows);
        if (new_game->grid == NULL)
        {
            free(new_game);
            return NULL;
        }
        for (int i = 0; i < rows; i++)
        {
            new_game->grid[i] = malloc(sizeof(char) * columns);
            // establecer cada celda a una cadena vacía
            if (new_game->grid[i] == NULL)
            {
                for (int j = 0; j < i; j++)
                {
                    free(new_game->grid[j]);
                }
                free(new_game->grid);
                free(new_game);
                return NULL;
            }
        }
        for (int i = 0; i < rows; i++)
        {
            for (int j = 0; j < columns; j++)
            {
                new_game->grid[i][j] = ' ';
                printf("%c ", new_game->grid[i][j]);
            }
        }
    }
    return new_game;
}

El problema es que no funciona porque devuelve el error de violación de segmento. ¿Cómo puedo crear una cuadrícula de caracteres? ¿O debo crear una matriz de cadenas porque no puedo tener caracteres en una fila, sino que necesito unirlas creando una cadena?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Hay un par de problemas en el código proporcionado que pueden llevar a errores de segmentación.

    Primero, dado que grid es un array bidimensional de caracteres, la asignación debería hacerse de la siguiente manera:

    new_game->grid = malloc(sizeof(char*) * rows);
    if (new_game->grid == NULL)
    {
        free(new_game);
        return NULL;
    }
    
    for (int i = 0; i < rows; i++)
    {
        new_game->grid[i] = malloc(sizeof(char) * columns);
        if (new_game->grid[i] == NULL)
        {
            // liberar asignaciones anteriores
            for (int j = 0; j < i; j++)
            {
                free(new_game->grid[j]);
            }
            free(new_game->grid);
            free(new_game);
            return NULL;
        }
    }
    

    Observa que primero se asigna un array unidimensional de punteros para representar las filas, y luego se asigna cada fila como un array unidimensional de caracteres.

    Segundo, los parámetros de función columns y rows no se están utilizando. Es posible que las variables previstas sean new_game->columns y new_game->rows, aunque estas no se declaran en ningún lugar. Suponiendo que ese sea el caso, el tercer bucle debería modificarse en consecuencia:

    for (int i = 0; i < new_game->rows; i++)
    {
        for (int j = 0; j < new_game->columns; j++)
        {
            new_game->grid[i][j] = ' ';
            printf("%c ", new_game->grid[i][j]);
        }
        printf("\n");
    }
    

    Finalmente, en cuanto a si utilizar un array de strings o un array bidimensional de caracteres, ambas son opciones válidas pero tienen implicaciones diferentes. Un array de strings es un array unidimensional de punteros a strings terminados en null, lo cual puede ser útil si la longitud de los strings varía por fila. Un array bidimensional de caracteres, por otro lado, es un bloque contiguo de memoria que representa una matriz de caracteres y puede ser más eficiente para ciertas operaciones. La elección depende de los requisitos específicos del programa.

Comments are closed.