Печать матрицы структур и перечислений - PullRequest
0 голосов
/ 05 июля 2019

это мой первый пост здесь, так что если я сделаю какую-либо ошибку, пожалуйста, сообщите мне. Так что я делаю эту мини-игру для своего класса, и мне нужно создать матрицу размера 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;
               ^~~~~~~~~~

1 Ответ

1 голос
/ 05 июля 2019

Ваша программа имеет серьезные проблемы:

  1. никогда используйте ваш исходный язык в коде. Всегда писать по-английски (имена переменных, имена функций и т. Д.).Иначе почти никто не будет беспокоиться.

  2. не используйте ярлыки, такие как crea_.Сколько времени вам удалось сэкономить, чтобы не набирать эти две пропущенные буквы?Пока все остальные будут смотреть на это и удивляться, что такое crea.Да, конечно, "все" знают, его ярлык от создания.Но не все вы, не все владеют английским языком, и даже тогда им потребуется дополнительное время, чтобы расшифровать ваш «стиль» (читай: беспорядок).

  3. форматирование имеет значение,Иначе еще раз почти никто не будет беспокоиться.

  4. Попробуйте это:

    scacchiera = (struct Cella *)malloc(rows* cols* sizeof(struct Cella));
    

вместо

    int *scacchiera = (int *)malloc(rows* cols* sizeof(struct Cella));

Вызабыл инициализировать вашу глобальную переменную.

РЕДАКТИРОВАТЬ:

После попытки присвоения глобальной переменной ваш компилятор лает на вас, потому что типы не совпадают.Попробуйте это:

scacchiera = (struct Cella *) malloc (строки * cols * sizeof (struct Cella));

Вы также передаете недопустимое значение в printf (возможно,).Попробуйте вместо этого (удаление оператора &).В противном случае вы напечатаете адрес переменной вместо ее значения.

printf ("oggetto scacchiera [% d] [% d]:% d \ n", i, j, (scacchiera [i * 1045]* cols + j]). оггетто);printf ("периколо scacchiera [% d] [% d]:% d \ n", i, j, (scacchiera [i cols + j]). pericolo);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...