Passaggio per riferimento delle strutture
il main.c invoca la procedura combat_s contenuta in combattimento.c che invoca la procedura carica_e contenuta in salva_carica.c
parte del file combattimento.c
#include <stdio.h>
#include <stdlib.h>
#include "salva_carica.h"
void combat_s()
{
personaggio eroe,nemico;
int start;
carica_e(eroe);<----------------------------------------WARNING
printf("-------PERSONAGGIO CARICATO-------");
stampa_personaggio(eroe);
carica_n(nemico);
start=iniziativa(eroe,nemico);
if (star)
{.......................restante codice di combat_s non importante allo scopo della risoluzione
}
}
parte del file salva_carica.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define DIM_NOME 20
#define N_CARATTERISTICHE 11
typedef struct
{
char nome[DIM_NOME],razza,classe;
int id,caratteristiche[N_CARATTERISTICHE];
} personaggio;
void carica_e(personaggio dati)
{
int id;
FILE *eroi;
eroi=fopen("database_eroi.bin","r");
if (eroi==NULL)
{
printf("Impossibile caricare, nessun eroe creato");
exit(1);
}
else
{
printf("Inserisci id");
scanf("%d",&id);
fseek(eroi,(id)*sizeof(personaggio),SEEK_SET);
fread(&dati,sizeof(personaggio),1,eroi);
fclose(eroi);
}
}
compilando combattimento.c ricevo un warning all'invocazione di carica_e:
local variabile 'eroe' used without having been inizialized
Certo, perché la variabile 'eroe' è passata alla carica_e per valore, quindi il valore di eroe viene ricopiato sul parametro della carica_e. Il compilatore dubita che questa sia una buona cosa, visto che in 'eroe' lei non ha ancora messo niente.
Le ricordo che le strutture vengono passate per valore (a default), se vogliamo passarle per riferimento dobbiamo mettere noi esplicitamente il passaggio per riferimento.
e in effetti, eseguendo il programma, la funzione carica_e funziona correttamente, vengono caricati i dati da database ma non vengono passati in combat_s e col debugging si vede che la variabile eroe di tipo personaggio ha tutti i valori di partenza assegnati dal c (per esempio, per gli interi il numero più basso) e ciò vuol dire che la variabile eroi non ha subito variazioni, invece la variabile dati si.
Esatto, infatti la variabile 'dati' viene passata per riferimento alla fread (infatti, c'è la &
davanti).