PDA

View Full Version : [C] Problemi su gestione liste e allocazione...urgente!


junkieman
21-07-2012, 19:37
Primo thread, ragazzi, spero possiate darmi una mano... :)

Ho da poco iniziato a programmare facendomi le ossa sul C, e mi sono
bloccato nel cercare di realizzare il programma che segue, la cui traccia è
all'incirca questa:

---> Verificata l'esistenza di un file binario contenente le informazioni
relative a un singolo esame su una classe di studenti (nome, cognome,
matricola, voto): si scriva un codice contenente una funzione che
carichi in memoria heap i dati dell'intera classe, e si crei poi la lista ordinata
in ordine crescente di voto per i soli studenti che hanno superato (18/30)
l'esame.

Ho già realizzato il codice per creare il suddetto file binario e fila liscio,
ho poi cercato di svolgere la traccia e, in compilazione, non ci sono
errori o warning...ma il programma va in crash in esecuzione.

Dove sbaglio?

Il codice della funzione principale, a cui viene passato
il file già aperto, è:


void carica(FILE *fb)
{
struct stud *info;
struct nodo *nuovo, *corr, *prec;
struct nodo *inizio = NULL;

unsigned int tot;
int n, i;

fseek(fb, 0, SEEK_END);
tot = ftell(fb);
n = (int) tot / sizeof(struct stud);
rewind(fb);

info = malloc(sizeof(struct stud)*n);
for(i=0; i<n; i++)
{
fread(info, sizeof(struct stud), 1, fb);
if((info->voto) >= 18)
{
nuovo = (struct nodo*)malloc(sizeof(struct nodo));

if(nuovo != NULL)
{
strcpy(nuovo->nome, info->nome);
strcpy(nuovo->cognome, info->cognome);
strcpy(nuovo->matricola, info->matricola);
nuovo->voto = info->voto;
nuovo->pros = NULL;

prec=NULL;
corr=inizio;

while( ( corr != NULL) && ( nuovo->voto >= corr->voto ) )
{
prec = corr;
corr = corr->pros;
}

if(prec == NULL)
{
nuovo->pros = inizio;
inizio = nuovo;
}
else
{
prec->pros = nuovo;
nuovo->pros = corr;
}
}
else
{
printf("\n\nMemoria esaurita!\n");
break;
}
free(nuovo);
}
free(info);
}
}



Grazie in anticipo a chiunque volesse rispondermi...buon weekend! :cool:

WarDuck
21-07-2012, 20:38
Crasha nel caricamento o altrove?

Perché ad una occhiata molto rapida, fai delle free su "nuovo" che non vedo perché tu debba fare (se vuoi accedere al di fuori della funzione alla struttura).

junkieman
22-07-2012, 10:35
Tutto risolto, grazie...mi sono spremuto le meningi e, come era ovvio, la soluzione era a portata di mano.. :doh:

..in effetti la traccia non specificava di caricare in un'unica area di memoria tutti i dati in una sola volta quindi, una volta verificato (attraverso la
sequenza fseek-->rewind) con quante struct avevo a che fare nel
file di partenza ho usato un ciclo per allocarle una per volta (in una
struct stud *temp, su cui applicare free alla fine di ogni iterazione) e, nel
caso il requisito di base fosse stato verificato (voto>=18), portare i
dati di quella struct in un nodo e inserirlo nella lista:


for(i=0; i<n; i++)
{
temp = (struct stud*)malloc(sizeof(struct stud));
fread(temp, sizeof(struct stud), 1, fb);
if((temp->voto) >= 18)
{
nuovo = (struct nodo*)malloc(sizeof(struct nodo));

if(nuovo != NULL)
{
...eccetera.

Ho infine aggiunto una funzione (interna a carica) per stampare a video
i risultati finali e..
void stampaLista(struct nodo *testa)
{
if(testa != NULL)
{
printf("\n\nLa lista risultante e\':\n");

while(testa != NULL)
{
printf("%s ", testa->nome);
printf("%s ", testa->cognome);
printf("%s ", testa->matricola);
printf("%d\n", testa->voto);
testa = testa->pros;
}
}
else
printf("\n\nLa lista e\' vuota!\n\n");
}

..voilà, il gioco è fatto.

Spero queste "piccole" dritte possano essere utili a qualcuno con
problemi simili! :mano:

Have a great day!

smemo90
22-07-2012, 16:27
scusa potresti passarmi l'intero codice del tuo programma per favore? mi servirebbe capire come hai proceduto (sono alle prime armi e ho avuto un compito simile). Grazie!