PDA

Visualizza la versione completa : [C] Valori errati in una Struct


faximusy
19-12-2010, 02:20
Salve a tutti, ho un problema a dir poco curioso.

Ho, nel mio codice, un tipo struct, formato in questo modo:



typedef struct elementMat {
int riga;
int numero;
int colonna;
struct elementMat *link;
} elementMat;


la cella di una lista concatenata. Fin qui, tutto ok.

Nel prosequio del codice, i campi degli oggetti del tipo struct vengono inizializzati tramite una lettura da file (con funzione fscanf).

L'operazione riesce benissimo. Viene effettuata all'interno di un ciclo, fin quando ci sono ancora dati nel file.



Il problema nasce al di fuori del ciclo, ed in generale della funzione che crea la lista concatenata.

Quando si va ad accedere ai dati della lista, alcuni valori sono corretti ed altri (ad intervalli regolari) non lo sono.

Esempio, i valori contenuti nei campi sono:



Numero Riga Colonna
1 2 3
2 3 54234565
3 1 2
4 2 4144455

e cosi via, considerando validi solo i valori n<5



La cosa assurda che, cambiando l'ordine degli elementi nella struct, il dato sballato risulta essere un altro (ad esempio riga), oppure , con alcune disposizioni degli elementi nella definizione della struct, il programma va in crash.


Esempio di crash:



typedef struct elementMat {
struct elementMat *link;
int riga;
int numero;
int colonna;
} elementMat;



Secondo voi cosa causa questo strano comportamento? Non riesco a risolvere, perch la cosa non ha alcun senso. Come possibile che quei campi vengano sovrascritti? Mi sembra assurdo.


Grazie anticipatamente.

GliderKite
19-12-2010, 11:53
Posta il codice (ben indentato) della funzione che crea un nuovo nodo.

faximusy
19-12-2010, 13:41
Grazie per la risposta,
la funzione questa; crea direttamente l'intera lista.

Il tipo matriceADT un puntatore ad una struct che contiene due puntatori, rispettivamente al primo elemento della lista ed all'ultimo.

Il nome del file passato come argomento.



elementMat *elementoPT;
matriceADT matrice;
FILE *fp;
fp=fopen(file,"r");
elementoPT=malloc(sizeof(elementMat *));
if(elementoPT==NULL) {
printf("\n\nMemoria indisponibile\n");
exit(EXIT_FAILURE);
}
if(fscanf(fp,"%d %d %d",&elementoPT->riga,&elementoPT->colonna,&elementoPT->numero) !=EOF ) {
elementoPT->link=NULL;
}
else {
printf("\n***ERRORE***\nIl file contiene dati non validi\n");
exit(EXIT_FAILURE);
}
matrice->primo=elementoPT;
matrice->ultimo=matrice->primo;

while(1) {
elementoPT->link=malloc(sizeof(elementMat *));
if(elementoPT->link==NULL) {
printf("\n\nMemoria indisponibile\n");
exit(EXIT_FAILURE);
}
elementoPT=elementoPT->link;
elementoPT->link=NULL;
if(fscanf(fp,"%d %d %d",&elementoPT->riga,&elementoPT->colonna,&elementoPT->numero) !=EOF) {
matrice->ultimo=elementoPT;
}
else {
matrice->ultimo->link=NULL; //altrimenti visualizza un'area di memoria in piu, che CMQ viene CREATA!!
break;
}
}

fclose(fp);
return(matrice);



Leggendo i valori all'interno del ciclo while, subito dopo essere stati quindi inizializzati, sono corretti.

Immediatamente fuori al ciclo, provando a leggerli, si ottengono dati sballati del campo "colonna", ma solo per termini "pari" (il secondo, il quarto,...) con questa particolare disposizione dei campi nella struct elementMat.


Grazie

faximusy
19-12-2010, 15:02
Ho risolto, grazie a tutti.

Non appena ho qualche minuto di tempo, posto la motivazione del problema.

A pi tardi

Loading