|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: May 2011
Messaggi: 3
|
[C] Problemi su gestione liste e allocazione...urgente!
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, è: Codice:
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! |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: May 2001
Messaggi: 12960
|
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). |
|
|
|
|
|
#3 |
|
Junior Member
Iscritto dal: May 2011
Messaggi: 3
|
Tutto risolto, grazie...mi sono spremuto le meningi e, come era ovvio, la soluzione era a portata di mano..
..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: Codice:
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)
{
Ho infine aggiunto una funzione (interna a carica) per stampare a video i risultati finali e.. Codice:
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");
}
Spero queste "piccole" dritte possano essere utili a qualcuno con problemi simili! ![]() Have a great day! |
|
|
|
|
|
#4 |
|
Junior Member
Iscritto dal: Jul 2012
Messaggi: 1
|
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!
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 08:58.




















