PDA

View Full Version : [C]Passare una struct per riferimento


Skamp12
28-01-2019, 17:08
Ciao a tutti premetto che sia una domanda molto banale ma sto impazzendo non riesco a passare una struct per riferimento perche una volta uscito dalla funzione di riempimento e passata la struct alla funzione di stampa la struct risulta essere vuota,dov'e che sbaglio?


Questa è la struct:
typedef enum {NESSUN_PERICOLO=1,TRAPPOLA,ALIENO} tipo_pericolo;
typedef enum { MEDIKIT=1,POZIONE,MATERIALE,COLPI_LANCIARAZZI} tipo_ogetto;
struct Cella{
tipo_pericolo pericolo;
tipo_ogetto oggetto;
};

Questo è il prototipo di funzione:

static struct Cella *map=NULL;
void crea_scacchiera(struct Cella *mapp,int righe,int colonne);


E questa è la sua chiamata
do{
rewind(stdout);
rewind(stdin);
printf("1-CREA SCACCHIERA\n");
printf("2-STAMPA SCACCHIERA\n");
printf("3-TERMINA CREAZIONE\n");
printf("?");
rewind(stdout);
rewind(stdin);
scanf("%d",&f);
switch (f) {
case 1: crea_scacchiera(&map,rig,col);
break;
case 2:stampa_scacchiera(map,rig,col);
break;
case 3: termina_creazione();
break;
default:puts("COMANDO INVALIDO SCEGLIERE DA 1 A 3\n");
break;
}
}while(f!=3);


nella chiamata se uso la "&" mi da errore in fase di compilazione se non la uso la struct una volta uscito dalla funzione risulta essere vuota

melko
29-01-2019, 13:06
giusto che ti dia errore se usi &map, perché per come l'hai dichiarato
map è già un puntatore a struct Cella, che coincide col prototipo della funzione crea_scacchiera.

Per il secondo problema, stai allocando da qualche parte lo spazio per la struct?
Non si evince dai frammenti di codice che hai postato.

Skamp12
29-01-2019, 13:55
giusto che ti dia errore se usi &map, perché per come l'hai dichiarato
map è già un puntatore a struct Cella, che coincide col prototipo della funzione crea_scacchiera.

Per il secondo problema, stai allocando da qualche parte lo spazio per la struct?
Non si evince dai frammenti di codice che hai postato.
si uso la malloc per allocare dinamicamente la struct a seconda di quanto l'untente inserisca la grandezza questo è il codice:
printf("Inserire dimensione scacchiera:");
rewind(stdout);
scanf("%d",&righe);
colonne=righe;
mapp=malloc(righe*colonne*sizeof(struct Cella));

melko
29-01-2019, 14:25
e la malloc la fai dentro la funzione crea_scacchiera?
In caso affermativo dato il prototipo della suddetta funzione, non hai modo di modificare da dentro crea_scacchiera
il puntatore mapp, che viene passato per valore. Se vuoi modificare il puntatore devi passargli un puntatore a puntatore.

In alternativa invece che passarlo come argomento, puoi metterlo nel valore di ritorno della funzione.

EDIT
noto però che rig e col le passi da fuori, quindi forse l'allocazione non la fai dentro crea_scacchiera,
in tal caso posta tutto il codice della funzione, altrimenti è difficile capire

Skamp12
29-01-2019, 14:33
si rig e col le ho dichiarate come variabili globali in modo che possa stampare la scacchiera ovunque senza che gli passi ogni volta le grandezze e si la malloc la facevo dentro la funzione per una questione di comodità però a sto punto uso la malloc prima della funziona e poi gli passo mapp e lo riempo

melko
29-01-2019, 14:40
In generale però fare uso di variabili globali, se non realmente necessario, è considerata
una cattiva pratica (e per buoni motivi) e generalmente è sconsigliato farlo.

Skamp12
29-01-2019, 14:49
In generale però fare uso di variabili globali, se non realmente necessario, è considerata
una cattiva pratica (e per buoni motivi) e generalmente è sconsigliato farlo.
sisi lo so è un progetto per l'università è stato specificato dal professore che non è considerata una cosa buona fare c'e lo fa fare solo per facilitarci un minimo il lavoro

Skamp12
29-01-2019, 15:24
Ho un altra domanda ora il programma lo ho diviso in 3 parti main.c gamelib.c e gamelib.h dove in gamelib.h ho tutte le dichiariazioni e in gamelib.c lo svolgimento delle funzioni, ora c'e una funzione che dal centro di una funzione in gamelib.c blocchi tutto e mi riporti al main?

lorenzo001
30-01-2019, 10:58
No, non esiste una cosa del genere. E sarebbe pure sbagliato.

Almeno, per quello che ho capito dalla tua richiesta ...

Esattamente cosa vorresti fare e a cosa ti servirebbe?

melko
30-01-2019, 13:27
una cosa tipo un long jump (https://en.wikipedia.org/wiki/Setjmp.h)?

In ogni caso, a parte per cultura personale, non è una cosa che utilizzerei nel tuo caso.