Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Problema con una lista e consigli
Forum - C/C++ - Problema con una lista e consigli

Avatar
Vignus (Normal User)
Newbie


Messaggi: 2
Iscritto: 19/04/2016

Segnala al moderatore
Postato alle 22:13
Martedì, 19/04/2016
Salve a tutti, sono alle prime armi con i linguaggi di programmazione. Ho imparato bene fino a adesso le cose basi come le variabili,i cicli,le strutture,puntatori ecc... sono arrivato al creare delle liste, ho provato a creare una semplice lista che gestisce i nomi di persone (giusto per capire come funzionano) solo che una volta terminato il programma e ricontrollato quando vado a compilare mi dà questi errori:
C:\Users\mattia\AppData\Local\Temp\ccsfSAiB.o    lista.cpp:(.text+0x88): undefined reference to `svouta_lista()'
C:\Users\mattia\AppData\Local\Temp\ccsfSAiB.o    lista.cpp:(.text+0x98): undefined reference to `svouta_lista()'
c:\program files (x86)\dev-cpp\mingw64\x86_64-w64-mingw32\bin\ld.exe    C:\Users\mattia\AppData\Local\Temp\ccsfSAiB.o: bad reloc address 0x27 in section `.text$_ZNSt11char_traitsIcE7compareEPKcS2_y[_ZNSt11char_traitsIcE7compareEPKcS2_y]'
C:\Users\mattia\Desktop\Mattia\lavori c\collect2.exe    [Error] ld returned 1 exit status

Ecco il codice sorgente:

Codice sorgente - presumibilmente C++

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4.  
  5. struct nodo{
  6.         string nome;
  7.         nodo* succ;
  8. };
  9. nodo* testa;
  10.  
  11. void inizializza();
  12. bool lista_vuota();
  13. void inserisci();
  14. void elimina();
  15. void visualizza();
  16. void svouta_lista();
  17. void presenta_menu();
  18.  
  19. int main() {
  20.         short int s;
  21.         inizializza();
  22.         presenta_menu();
  23.         do{
  24.                 do{
  25.                         cout<<"\nOPZIONE NUMERO: ";
  26.                         cin>>s;
  27.                                         }
  28.                                         while(s<1 || s>5);
  29.                                         switch(s)
  30.                                         {
  31.                                                 case 1:
  32.                                                         inserisci();
  33.                                                         break;
  34.                                                 case 2:
  35.                                                         elimina();
  36.                                                         break;
  37.                                                 case 3:
  38.                                                         visualizza();
  39.                                                         break;
  40.                                                 case 4:
  41.                                                         svouta_lista();
  42.                                                         break;
  43.                                         }
  44.                                         } while (s!=5);
  45.                                         svouta_lista();
  46.                 return 0;
  47.                 }
  48.  
  49. void inizializza()
  50. {
  51.         testa=NULL;
  52. }
  53.  
  54. bool lista_vuota()
  55. {
  56.         if(testa==NULL)
  57.         return true;
  58.         return false;
  59. }
  60.  
  61. void inserisci()
  62. {  
  63.     short int x;
  64.         string nome;
  65.         nodo* nuovo;
  66.         nodo* temp;
  67.         nodo* prec;
  68.         cout<<"Inserisci il numero di nomi da inserire: ";
  69.         cin>>x;
  70.         for (int i=0;i<x;i++) {
  71.         cout<<"Inserisci il nome: ";
  72.         cin>>nome;
  73.         nuovo= new nodo;
  74.         nuovo->nome=nome;
  75.         nuovo->succ=NULL;
  76.         if (lista_vuota())
  77.         testa= nuovo;
  78.         else {
  79.                 if (testa->nome >= nuovo->nome) {
  80.                         temp=testa;
  81.                         testa=nuovo;
  82.                         testa->succ= temp;
  83.                         }
  84.                 else {
  85.                         temp= testa;
  86.                         while (temp!=NULL && nuovo->nome >= temp->nome) {
  87.                                 prec=temp;
  88.                                 temp= temp->succ;
  89.                         }
  90.                         nuovo->succ= temp;
  91.                         prec->succ= nuovo;
  92.                 }
  93.                
  94.         }
  95. }
  96. }
  97.  
  98. void elimina()
  99. {
  100.         string nome;
  101.         nodo* temp;
  102.         nodo* prec;
  103.         bool trovato= false;
  104.         cout<<"Nome da eliminare: ";
  105.         cin>>nome;
  106.         if (lista_vuota())
  107.         cout<<"Lista vuota";
  108.         else {
  109.                 if (testa->nome == nome) {
  110.                         trovato=true;
  111.                         temp= testa->succ;
  112.                         cout<<"Il nome eliminato e\': "<<testa->nome<<endl;
  113.                         delete testa;
  114.                         testa= temp;
  115.                 }
  116.                 else {
  117.                         temp=testa->succ;
  118.                         prec= testa;
  119.                         do {
  120.                                 if(temp->nome == nome) {
  121.                                         trovato=true;
  122.                                         prec->succ= temp->succ;
  123.                                         cout<<"Il nome eliminato e\': "<<temp->nome<<endl;
  124.                                         delete temp;   
  125.                                 }
  126.                                 else {
  127.                                         prec=temp;
  128.                                         temp=temp->succ;
  129.                                 }
  130.                         } while(!trovato && temp!=NULL);
  131.                 }
  132.                 if (!trovato)
  133.                 cout<<"Il nome non esiste"<<endl;
  134.         }
  135. }
  136.  
  137. void visualizza()
  138. {
  139.         nodo* p;
  140.         cout<<"--- Elenco dei nomi: ---"<<endl;
  141.         p= testa;
  142.         while (p!=NULL) {
  143.                 cout<<"* "<<p->nome<<endl;
  144.                 p=p->succ;
  145.         }
  146.         cout<<"--- Fine elenco ---";
  147. }
  148.  
  149. void svuota_lista()
  150. {
  151.         nodo* p;
  152.         nodo* temp;
  153.         while (testa != NULL) {
  154.                 temp= testa;
  155.                 testa= testa->succ;
  156.                 delete temp;
  157.                 }
  158.                 cout<<"Lista vuota"<<endl;
  159. }
  160.  
  161. void presenta_menu()
  162. {
  163.         cout<<endl<<"***********************"<<endl;
  164.         cout<<"1. Inserisci nome: "<<endl;
  165.         cout<<"2. Elimina nome: "<<endl;
  166.         cout<<"3. Visualizza lista: "<<endl;
  167.         cout<<"4. Svuota lista al momento non disponibile :( "<<endl;
  168.         cout<<"5. Fine: "<<endl;
  169.         cout<<"***********************"<<endl;
  170. }



Praticamente mi dà problemi sulla funzione svuota_lista e non capisco come mai, forse ho fatto qualche errore con i puntatori non so. Infatti cancellando la funzione svuota_lista il resto del programma gira bene. Potete darmi una mano? :hail:
Un' altra cosa, secondo voi cos è veramente importante da studiare se voglio diventare un programmatore di buon livello riguardo al C++ o altri linguaggi di programmazione? Grazie ;)

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 22:30
Martedì, 19/04/2016
Programmare significa fare MOLTA attenzione ...

svuota

e

svouta

sono parole diverse ...


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Template (Member)
Pro


Messaggi: 177
Iscritto: 09/12/2015

Segnala al moderatore
Postato alle 1:00
Mercoledì, 20/04/2016
Un errore banalissimo, che avresti potuto trovare da solo semplicemente leggendo il messaggio di errore...

Comunque:

Testo quotato

Postato originariamente da Vignus:
Un' altra cosa, secondo voi cos è veramente importante da studiare se voglio diventare un programmatore di buon livello riguardo al C++ o altri linguaggi di programmazione? Grazie ;)



Secondo me è importante abbandonare l'autodidattica: di self-taught programmers validi ne esistono, ma sono in quantità irrisoria rispetto a tutti gli autodidatti che non vanno oltre qualche riga di codice buttata a caso...

Detto questo, se proprio vuoi provare ad imparare il C++ (a proposito: ma il C lo conosci già?), per iniziare ti servono un buon testo introduttivo (io spesso consiglio "C++ primer plus" di S. Prata) e la reference guide di Bjarne Stroustrup...




(Un pensiero generale: nessuno usa più la sezione di presentazione? L'autore di questo topic è l'ennesimo utente che spara le sue domande senza essersi nemmeno presentanto...)

Ultima modifica effettuata da Template il 20/04/2016 alle 1:03
PM Quote
Avatar
Vignus (Normal User)
Newbie


Messaggi: 2
Iscritto: 19/04/2016

Segnala al moderatore
Postato alle 20:58
Mercoledì, 20/04/2016
Grazie mille non ci avevo fatto caso! Adesso ho capito che devo ricontrollare bene anche i nomi delle funzioni. Comunque scusate se non mi sono presentato... :rofl:

PM Quote
Avatar
Template (Member)
Pro


Messaggi: 177
Iscritto: 09/12/2015

Segnala al moderatore
Postato alle 22:53
Mercoledì, 20/04/2016
Testo quotato

Postato originariamente da Vignus:
Adesso ho capito che devo ricontrollare bene anche i nomi delle funzioni.



Ma vedi, il nodo della questione è più generale: ciò a cui devi fare attenzione è la risposta del debugger.
Ogni errore di compilazione segnalato va letto ed analizzato attentamente, per cercare di capire cosa voglia dire: nel caso specifico, per esempio, l'errore segnalato presenta la descrizione undefined reference to `svouta_lista()', il cui possibile significato è evidente anche se non ti accorgi dell'inversione delle vocali.
Insomma, non è che devi controllare anche i nomi delle funzioni: devi stare attento a cosa ti dice il debugger, che di fatto nella scrittura del codice è il tuo più valido alleato ;)

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 5:21
Giovedì, 21/04/2016
Testo quotato

Postato originariamente da Template:
a cosa ti dice il debugger



O il linker, in questo caso.


Il mio blog: https://piero.dev
PM Quote
Avatar
Template (Member)
Pro


Messaggi: 177
Iscritto: 09/12/2015

Segnala al moderatore
Postato alle 8:06
Giovedì, 21/04/2016
Testo quotato

Postato originariamente da pierotofy:

O il linker, in questo caso.



Hai ragione :rotfl:
Purtroppo, la stanchezza fa sì che io ogni tanto sbagli termini

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 8:53
Giovedì, 21/04/2016
Hai sbagliato ben due volte !   Due punti in meno .... :yup:


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Template (Member)
Pro


Messaggi: 177
Iscritto: 09/12/2015

Segnala al moderatore
Postato alle 8:55
Giovedì, 21/04/2016
Me ne assumo la totale responsabilità... rileggendo quanto ho scritto mi sono accorto che in effetti l'errore è stato veramente indecente :rotfl:

PM Quote