Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Non riesco ad accedere ad un campo di una struct linkata
Forum - C/C++ - Non riesco ad accedere ad un campo di una struct linkata

Avatar
dita94 (Normal User)
Newbie


Messaggi: 3
Iscritto: 05/05/2009

Segnala al moderatore
Postato alle 14:22
Martedì, 18/11/2014
Salve a tutti, ho un problema in un programma scritto su più sorgenti.
Il programma consiste nel gestire delle struct linkate non ordinate per degli studenti.
Ogni struct ha contiene un item e i link al precedente e al successivo nodo, gli item sono delle struct contenenti 3 puntatori a stringa(nome, cognome, matricola) e un altra struct chiamata carriera che contiene numero di crediti e media.

Gli item sono definiti nel file item.c e item.h così:
item.c
Codice sorgente - presumibilmente C++

  1. struct s_carriera
  2. {
  3.     int crediti;
  4.     float media;
  5. };
  6.  
  7. struct studente
  8. {
  9.     char *nome;
  10.     char *cognome;
  11.     char *matricola;
  12.     struct s_carriera carriera;
  13. };



item.h
Codice sorgente - presumibilmente C/C++

  1. typedef struct studente* Item;



mentre nel file lista.c e lista.h:

lista.c
Codice sorgente - presumibilmente C++

  1. typedef struct nodolista *Link;
  2.  
  3. struct nodolista
  4. {
  5.     Item item;
  6.     Link next;
  7.     Link prev;
  8. };
  9.  
  10. struct lista
  11. {
  12.     Link primo;
  13.     Link ultimo;
  14.     int n;
  15. };



lista.h
Codice sorgente - presumibilmente C/C++

  1. typedef struct lista *Lista;



I collegamenti tra diversi file e il capire a cosa si riferiscono i nomi potrebbe essere un po' difficile, lo so. :D

Ad un certo punto il programma, cioè il main, vuole stampare l'elenco di studenti memorizzati(letti in precedenza da tastiera tramite altre funzioni)
e chiama una funzione presente in lista.c chiamata lista_stampa

lista.c
Codice sorgente - presumibilmente C/C++

  1. void lista_stampa(Lista l)
  2. {
  3.     Link tmp;
  4.    
  5.     char *strpunt;
  6.         int tmpn;
  7.  
  8.     for(tmp = l->primo; tmp != NULL; tmp = tmp->next)
  9.     {  
  10.         printf("NOME: ");
  11.         stampanome(tmp->item);
  12.     }
  13. }


Per ora, come si può vedere mi sono fermato al solo nome di ogni studente.

La funzione stampanome si trova nel file item.c(questo perchè dovrò creare altri tipi di strutture linkate ad esempio coda.c o pila.c)

stampanome recita così:

item.c
Codice sorgente - presumibilmente C/C++

  1. void stampanome(Item i)
  2. {
  3.         printf("%s\n", i->nome);
  4. }



A questo punto il programma mi sbatte in faccia l'errore di segmentazione... core dump creato e cose così... cioè credo di non poter accedere a i->nome che (almeno credo) dovrebbe equivalere per lista.c a tmp->item->nome

NB: il programma legge e memorizza bene ogni campo dei nodi(nome , cognome, matricola ecc) l'ho verificato col debugger.

Inoltre la mia idea di partenza era un'altra, molto più generale, molto più bella per me:

volevo che lista.c con un printf dentro il ciclo for di lista_stampa chiamasse una funzione del tipo:

Codice sorgente - presumibilmente C/C++

  1. char *getnome(Item i)
  2. {
  3.         return i->nome;
  4. }



dove Item i è sempre tmp->item


questo puntatore a stringa volevo che ritornasse come secondo argomento di un printf, ma comunque ricevevo sempre l'errore di segmentazione.
questa funzione mi sarebbe stata utile per necessità di confrontare con strcmp i nomi degli studenti(o i congomi, ecc)

Il mio sospetto è quello di sbagliare qualcosa nell'andare a cercare una stringa in i->nome oppure dare come argomento delle 2 varianti delle funzioni tmp->item.

Pure il mio italiano è contorto, scusate!

Ringrazio in anticipo qualsiasi aiuto.

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5461
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 15:46
Martedì, 18/11/2014
Un errore di quel tipo presuppone sempre un puntatore con un valore nullo o sbagliato, molte volte perché non è stata allocata in precedenza la memoria a cui dovrebbe puntare. Controlla passo passo con il debugger e risolvi facilmente.


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote