Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    C : lettura da file e inserimento in lista,segmentation fault solo su un compilatore

    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);
    }

  2. #2
    questo è l'errore segnalato da gdb :

    Program received signal SIGSEGV, Segmentation fault.
    inserisci_da_file (testa_p=0xbffff2fc, matricola=5,
    media_voto=27.199999999999999, cognome=0xbffff36e "bianchi")
    at progetto_asd.c:227
    227 ((corr_p != NULL) && (corr_p->matricola < matricola));


    nel for nella funzione inserisci_da_file.

    e i print effettuati in questo punto dell'esecuzione:

    (gdb) print corr_p
    $1 = (elem_lista_t *) 0xa
    (gdb) print prec_p
    $2 = (elem_lista_t *) 0xa
    (gdb) print testa_p
    $3 = (elem_lista_t **) 0xbffff2fc
    (gdb) print **testa_p
    Cannot access memory at address 0xa
    (gdb) print *testa_p
    $4 = (elem_lista_t *) 0xa
    (gdb) print testa_p->matricola
    Cannot access memory at address 0xa
    (gdb) print corr_p->matricola
    Cannot access memory at address 0xa
    è NULL inizialmente la testa come devo fare???

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    guarda di cose strane ne ho viste e ci sonoc ompilatori più sensibili di altri riguardo ad errori.
    Riguardo al tuo errore, di fatti tu stai tentando l'accesso ad un'area di memoria non valorizzata e/o non inizializzata quindi l'unico modo che un programma C ha per uscirne è la segmentation fault.
    Ora di fatto il codice così come è scritto (senza indentazioni e senza formattazione è pure difficile da leggere.
    Non so cosa deve fare l'esercizio, non so dove va in fault (non lo hai evidenziato), ti consiglio di controllare l'inizializzazione di tutti gli elementi e un controllo a NOT NULL della testa quando fai gli accessi dai vari metodi male non fa.
    RTFM Read That F*** Manual!!!

  4. #4
    scusate per l'indentazione ma mi è saltata facendo copia incolla.. però quello che deve fare il programma l'ho scritto ad inizio thread... per il resto il segmentation fault credo di averlo evidenziato ma per essere chiari lo riposto... (nella seconda risposta mia ho postato il messagio di errore del debugger gdb con i vari valori delle variabili in esame al momento della seg fault ).. comunque il ciclo in questione è questo che si può ritrovare nel codi ce già postato :

    /*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);

    e il seg fault arriva nel controllo delle condizioni , premetto che inizialmente la testa è inizializzata a NULL quando la lista è ancora vuota e ovviamente alla prima iterazione i puntatori saranno tutti a NULL.. per il resto non riesco a trovare il modo di risolverlo anche perchè questo ciclo l'ho usato più e più volte in varie esercitazioni allo stesso modo senza avere mai problemi..

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Originariamente inviato da semstar

    e il seg fault arriva nel controllo delle condizioni , premetto che inizialmente la testa è inizializzata a NULL quando la lista è ancora vuota e ovviamente alla prima iterazione i puntatori saranno tutti a NULL.. per il resto non riesco a trovare il modo di risolverlo anche perchè questo ciclo l'ho usato più e più volte in varie esercitazioni allo stesso modo senza avere mai problemi..
    e ti rispondi solo perché se già sai che al primo ciclo fa NULL, come speri di passare quel controllo senza una seg fault?
    E' ovvio che devi fare un controllo sulla head e se è null è il primo elemento che inserisci, quindi mettilo in testa!!!
    RTFM Read That F*** Manual!!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.