这是我在这里的第一篇文章,所以如果我有任何错误,请告诉我。
因此,我正在为我的班级制作这个迷你游戏,我需要(从输入中)创建一个n大小的矩阵,其中填充了一个枚举结构,该函数就是crea_scacchiera
。
当我想打印矩阵并传递给另一个函数(stampa_scacchiera)时,我尝试了一切,但找不到解决方法来打印出没有分割错误的矩阵。
小游戏分为3个文件:仅显示菜单的main.c,定义枚举和结构的gamelib.h,以及具有创建和打印矩阵的函数的gamelib.c。
我认为矩阵已正确填充,我只是找不到在其他函数中打印矩阵的方法。
//gamelib.h
extern void crea_mappa();
extern void gioca();
extern void termina_gioco();
enum Tipo_pericolo {nessun_pericolo, trappola, alieno} pericolo;
enum Stato_giocatore {vulnerabile, scudo_vita, solo_vita, solo_scudo};
enum Tipo_oggetto {nessun_oggetto, medikit, pozione, materiale, colpi_lanciarazzi} oggetto;
struct Giocatore
{
enum Stato_giocatore stato;
int Posizione_x;
int Posizione_y;
int zaino[4];
int alieni_uccisi;
};
struct Cella
{
enum Tipo_pericolo pericolo;
enum Tipo_oggetto oggetto;
};
//gamelib.c
#include "gamelib.h"
#include <stdio.h>
#include <stdlib.h>
//penso ci vadano anche dichiarazioni di variabili
int n;
void crea_scacchiera();
void stampa_scacchiera(struct Cella *scacchiera);
struct Cella *scacchiera= NULL;
static struct Giocatore Ninja;
static struct Giocatore Ciccio;
void crea_mappa()
{
int choice;
do {
printf(" \n");
printf("Sceglia cosa fare\n");
printf("1} crea scacchiera\n");
printf("2} stampa scacchiera\n");
printf("3} termina creazione\n");
printf(" \n");
scanf("%d",&choice );
switch (choice) {
case 1 :
crea_scacchiera();
break;
case 2 :
printf("stampa della scacchiera in corso\n");
stampa_scacchiera(scacchiera);
break;
case 3 :
printf("ritorno al menu della mappa\n");
system("clear");
break;
}
}
while (choice!=3);
}
void gioca()
{
printf("prova funzione, gioca\n");
}
void termina_gioco()
{
printf("prova funzione, termina gioco\n" );
}
void crea_scacchiera()
{
// enum Tipo_oggetto oggetto;
//enum Tipo_pericolo pericolo;
int i,j,rows,cols;
extern int n;
//static int perc1,perc2,perc3,perc4,perc5,perc6,perc7,perc8;
printf(" \n ");
printf("inserisci la grandezza della scacchiera\n ");
scanf("%d",&n);\
rows=n;
cols=n;
scacchiera = (struct Cella *)malloc(rows* cols* sizeof(struct Cella));
//int offset = i * cols + j;
for (i=0; i<n; i++){
for (j=0; j<n; j++){
scacchiera[i*cols+j].pericolo= trappola;
scacchiera[i*cols+j].oggetto= pozione;
}
}
Ninja.stato = solo_vita;
Ninja.Posizione_x= rand()%n+1;
Ninja.Posizione_y= rand()%n+1;
Ciccio.stato = solo_vita;
Ciccio.Posizione_x= rand()%n+1;
Ciccio.Posizione_y= rand()%n+1;
printf("%d\n",n );
}
void stampa_scacchiera(struct Cella *scacchiera) //FuncB
{
int i,j,cols;
cols = n;
extern int n;
cols=n;
for (i=0; i<n; i++){
for (j=0; j<n; j++){
printf("oggetto scacchiera [%d] [%d] : %d\n",i,j,(scacchiera[i*cols+j]).oggetto );
printf("pericolo scacchiera [%d] [%d] : %d\n",i,j,(scacchiera[i*cols+j]).pericolo );
}
}
}
我现在已经修改了程序,这是给我的错误
gamelib.c:154:39: error: declaration of ‘scacchiera’ shadows a global declaration [-Werror=shadow]
void stampa_scacchiera(struct Cella *scacchiera) //FuncB
^~~~~~~~~~
gamelib.c:11:15: note: shadowed declaration is here
struct Cella *scacchiera= NULL;
^~~~~~~~~~
答案 0 :(得分:1)
您的程序存在严重的问题:
从不在代码中使用您的原始语言。 始终以英文书写(变量名,函数名等)。否则几乎没有人会打扰。
请勿使用诸如crea_
之类的快捷方式名称。您节省了多少时间不键入这两个缺失的字母?当其他所有人都在看这个并想知道crea
是什么时。是的,当然,“每个人”都知道,它是创建时的捷径。但是,不是每个人都是您,不是每个人都是英语大师,即使如此,破译您的“风格”(阅读:混乱)也要花费他们更多的时间。
格式很重要。否则,几乎没有人会再打扰。
尝试一下:
scacchiera = (struct Cella *)malloc(rows* cols* sizeof(struct Cella));
代替
int *scacchiera = (int *)malloc(rows* cols* sizeof(struct Cella));
您忘记初始化全局变量。
编辑:
在尝试分配给全局变量后,由于类型不匹配,编译器将对您发出咆哮。试试这个:
scacchiera =(结构Cella *)malloc(行* cols * sizeof(结构Cella));
您还将无效值传递给printf(可能)。请尝试执行此操作(删除&
运算符)。否则,您将打印变量的地址而不是其值。
printf(“ oggetto scacchiera [%d] [%d]:%d \ n”,i,j,(scacchiera [i cols + j])。oggetto); printf(“ pericolo scacchiera [%d] [%d]:%d \ n”,i,j,(scacchiera [i cols + j])。pericolo);