我如何在C中填充并显示这个void***矩阵?

问题描述 投票:0回答:1

上下文:我需要使用 void*** 创建一个带有 2D 数组的棋盘游戏,在每个插槽中我必须首先放置一个结构“Tierra”,然后在稍后的回合中我可以放置一个结构“Bomba”

二维数组是一个全局变量,我有点东西

这是 Tierra 结构:

typedef struct Tierra{
    int vida; // random health (1-3)
    int es_tesoro; // 1 or 0 (5% chance of having a treasure)
} Tierra;

这里是创建数组的函数,该函数只能接收维度作为参数,并且必须是void():

void*** tablero;
int dimension;
const int chance[5]={1,2,3,4,5};

void IniciarTablero(int n){
    tablero = malloc(n*sizeof(void**));
    if(tablero == NULL){
        printf("%s", "error con la memoria \n");
        exit(1);
    }   
    for( int i=0 ; i<n ; i++){
        tablero[i] = malloc(n*sizeof(void*));
        if (tablero[i] == NULL){
            printf("%s", "error con la memoria \n");
            exit(1);
        }
        for( int j=0 ; j<n ; j++){
            Tierra* tierra;
            tierra->vida = (rand() % 3) + 1;
            int probabilidad = (rand() % 100);
            int contenido = 0;
            for (int c=0 ; c<5 ; c++){
                if(probabilidad==chance[c]){
                    contenido = 1;
                }
            }
            tierra->es_tesoro = contenido;
            tablero[i][j] = tierra;
        }
    }
}

这是我显示它的函数:

void MostrarTablero(){
    for (int i=0 ; i<dimension ; i++){
        for (int j=0 ; j<dimension ; j++){
            Tierra* imprimir = (Tierra*)tablero[i][j];
            printf("%d | ",imprimir->vida);
        }
        printf("\n");
    }
    return;
}

每当我尝试在 main 中调用 IniciarTablero() 然后调用 MostrarTablero 时,都会出现分段错误错误,而且它甚至没有进入 MostrarTablero() 。我认为问题可能在于我如何为 tablero[i][j] 赋值,但我是 c 新手,我还不知道如何使用指针。

提前感谢您,希望您度过愉快的一天/一夜。 <3

c multidimensional-array struct void-pointers
1个回答
0
投票

正如@paddy 所评论的,你不应该使用

void *
作为指针类型 在这种情况下。此外,您为每个分配内存
struct Tierra
的实体。
请您尝试一下:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

typedef struct Tierra {
    int vida; // random health (1-3)
    int es_tesoro; // 1 or 0 (5% chance of having a treasure)
} Tierra;

Tierra ***tablero;
int dimension;
const int chance[5] = {1, 2, 3, 4, 5};

void IniciarTablero(int n)
{
    tablero = malloc(n * sizeof(Tierra ***));
    for (int i = 0; i < n; i++) {
        tablero[i] = malloc(n * sizeof(Tierra **));
        for (int j = 0; j < n; j++) {
            Tierra *tierra = malloc(sizeof(Tierra));    // missing in the original code
            tierra->vida = (rand() % 3) + 1;
            int probabilidad = (rand() % 100);
            int contenido = 0;
            for (int c = 0; c < 5; c++) {
                if (probabilidad == chance[c]) {
                    contenido = 1;
                }
            }
            tierra->es_tesoro = contenido;
            tablero[i][j] = tierra;
        }
    }
}

void MostrarTablero()
{
    for (int i = 0; i < dimension; i++) {
        for (int j = 0; j < dimension; j++) {
            Tierra *imprimir = tablero[i][j];
            printf("%d | ", imprimir->vida);
        }
        printf("\n");
    }
}

int main()
{
    dimension = 4;              // just for example
    IniciarTablero(dimension);
    MostrarTablero();

    // don't forget to free() memory after use

    return 0;
}

请注意,仅检查

malloc()
的返回值被省略 为了简单起见,重点关注要点。

顺便说一句,如果值

dimension
是固定的(不是动态分配的), 最好使用简单的
struct Tierra
二维数组。

© www.soinside.com 2019 - 2024. All rights reserved.