sono un novellino della programmazione e mi scuso in anticipo se dovessi scrivere boiate.
Allora il mio programma legge da file una serie di triple di dati riguardanti ognuna uno studente e ognuna su nuova riga.
Una volta letta una riga le triple vengono inserite in una struttura dinamica , nel mio caso una lista ordinata per poi poterci eseguire varie operazioni quali modifiche , cancellazioni ,inserimenti , stampe ordinate.
Il problema nasce nellalettura da file quando parte il ciclo che va a scorrere la lista e confronta i numeri di matricola per trovare la giusta posizione dove inserire la nuova tripla. il problema nasce al primo inserimento e non dopo alcuni , verificato con gdb, ora posto le parti di codice inerenti , main e funzione apposita.
La cosa che mi lascia perplesso è perchè con il compilatore dev c++ e anche con gcc di un mio compagno di università sullo stesso ambiente ubuntu va tutto perfettamente mentre sul mio fisso con ubuntu e gcc ho questi problemi?? aiutatemi vi prego.. ho paura che inviando il sorgente cosi come è anche col compilatore del mio professore dia segmentation fault..
typedef struct elem_lista
{
int matricola;
double media_voto;
char cognome[LUNGHEZZA_COGNOME];
struct elem_lista *succ_p;
} elem_lista_t;
int inserisci_da_file(elem_lista_t **, int, double, char cognome[LUNGHEZZA_COGNOME] );
int main()
{
FILE *file_dati; /*puntatore al file contenete i dati*/
int matricola, /*variabile che conterrà i vari numeri matricola per gli inserimenti da file*/
continua, /**/
successo_operazione, /*ci dirà il risultato dell'operazione eseguita dall'utente*/
inserito, /**/
esito_lettura, /*variabile usata nella validazione dell'input per il risultato della scanf*/
i = 0, /*variabili per controlli e cicli*/
n = 0,
m = 0,
s = 0,
v = 0,
scelta = 0; /*conterrà la scelta del menù*/
double media_voto = 0;
char cognome[LUNGHEZZA_COGNOME] = "", /*variabile che conterrà i vari cognomi per gli inserimenti da file*/
supporto_dati[80] = "", /*variabili di supporto per la scansione delle varie righe del file*/
supporto_matricola[10] = "",
supporto_cognome[LUNGHEZZA_COGNOME] = "",
supporto_voto[5] = "",
*res, /*per il risultato della fgets*/
carattere_non_letto; /*utilizzato nella validazione dell'input*/
elem_lista_t *testa_p = NULL; /*inizializzo la testa della lista a null*/
file_dati = fopen("dati.txt", "r"); /*apertura del file da leggere*/
while((res = fgets(supporto_dati,80,file_dati)) != NULL ) /*mentre la lettura della riga non è nulla */
{
/*... parte in cui c'è il metodo di divisione dei dati dopo la lettura della stringa intera...*/
inserito = inserisci_da_file(&testa_p, matricola, media_voto, cognome);
/*inserisco nella struttura dinamica la tripla letta*/
/*--parte in cui pulisco le variabili utilizzate per la prossima riga..*/
}
fclose(file_dati);
/*...parte in cui c'è il menù di scelta per altre operazioni....*/
}
int inserisci_da_file(elem_lista_t **testa_p, int matricola, double media_voto, char cognome[20])
{
int inserito; /*conterrà l'esito dell'operazione*/
elem_lista_t *corr_p, /*variabili necessarie per scorrere la lista*/
*prec_p,
*nuovo_p;
/*ciclo che scorre la lista finchè non trova un numero matricola maggiore
di quello da inserire o arriva alla fine , troviamo la posizione della nuova tripla*/
for (corr_p = prec_p = *testa_p;
((corr_p != NULL) && (corr_p->matricola < matricola));
prec_p = corr_p, corr_p = corr_p->succ_p);
if ((corr_p != NULL) && (corr_p->matricola == matricola)) /*se la matricola è già presente*/
inserito = 0;
else
{
/*allochiamo il nuovo blocco della struttura e inseriamo i dati corrispondenti*/
inserito = 1;
nuovo_p = (elem_lista_t *)malloc(sizeof(elem_lista_t));
nuovo_p->matricola = matricola;
nuovo_p->media_voto = media_voto;
nuovo_p->succ_p = corr_p;
strcpy(nuovo_p->cognome, cognome);
/*successivamente leghiamo il blocco alla lista e in caso cambiamo la testa della lista*/
if (corr_p == *testa_p)
{
*testa_p = nuovo_p;
}
else
{
prec_p->succ_p = nuovo_p;
}
}
return(inserito);
}