Vignus (Normal User)
Newbie
Messaggi: 2
Iscritto: 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++ |
#include <iostream> #include <string> using namespace std; struct nodo{ string nome; nodo* succ; }; nodo* testa; void inizializza(); bool lista_vuota(); void inserisci(); void elimina(); void visualizza(); void svouta_lista(); void presenta_menu(); int main() { short int s; inizializza(); presenta_menu(); do{ do{ cout<<"\nOPZIONE NUMERO: "; cin>>s; } while(s<1 || s>5); switch(s) { case 1: inserisci(); break; case 2: elimina(); break; case 3: visualizza(); break; case 4: svouta_lista(); break; } } while (s!=5); svouta_lista(); return 0; } void inizializza() { testa=NULL; } bool lista_vuota() { if(testa==NULL) return true; return false; } void inserisci() { short int x; string nome; nodo* nuovo; nodo* temp; nodo* prec; cout<<"Inserisci il numero di nomi da inserire: "; cin>>x; for (int i=0;i<x;i++) { cout<<"Inserisci il nome: "; cin>>nome; nuovo= new nodo; nuovo->nome=nome; nuovo->succ=NULL; if (lista_vuota()) testa= nuovo; else { if (testa->nome >= nuovo->nome) { temp=testa; testa=nuovo; testa->succ= temp; } else { temp= testa; while (temp!=NULL && nuovo->nome >= temp->nome) { prec=temp; temp= temp->succ; } nuovo->succ= temp; prec->succ= nuovo; } } } } void elimina() { string nome; nodo* temp; nodo* prec; bool trovato= false; cout<<"Nome da eliminare: "; cin>>nome; if (lista_vuota()) cout<<"Lista vuota"; else { if (testa->nome == nome) { trovato=true; temp= testa->succ; cout<<"Il nome eliminato e\': "<<testa->nome<<endl; delete testa; testa= temp; } else { temp=testa->succ; prec= testa; do { if(temp->nome == nome) { trovato=true; prec->succ= temp->succ; cout<<"Il nome eliminato e\': "<<temp->nome<<endl; delete temp; } else { prec=temp; temp=temp->succ; } } while(!trovato && temp!=NULL); } if (!trovato) cout<<"Il nome non esiste"<<endl; } } void visualizza() { nodo* p; cout<<"--- Elenco dei nomi: ---"<<endl; p= testa; while (p!=NULL) { cout<<"* "<<p->nome<<endl; p=p->succ; } cout<<"--- Fine elenco ---"; } void svuota_lista() { nodo* p; nodo* temp; while (testa != NULL) { temp= testa; testa= testa->succ; delete temp; } cout<<"Lista vuota"<<endl; } void presenta_menu() { cout<<endl<<"***********************"<<endl; cout<<"1. Inserisci nome: "<<endl; cout<<"2. Elimina nome: "<<endl; cout<<"3. Visualizza lista: "<<endl; cout<<"4. Svuota lista al momento non disponibile :( "<<endl; cout<<"5. Fine: "<<endl; cout<<"***********************"<<endl; }
|
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?
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
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6403
Iscritto: 03/01/2010
|
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à. |
|
Template (Member)
Pro
Messaggi: 177
Iscritto: 09/12/2015
|
Un errore banalissimo, che avresti potuto trovare da solo semplicemente leggendo il messaggio di errore...
Comunque:
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 |
|
Vignus (Normal User)
Newbie
Messaggi: 2
Iscritto: 19/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...
|
|
Template (Member)
Pro
Messaggi: 177
Iscritto: 09/12/2015
|
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 |
|
pierotofy (Admin)
Guru^2
Messaggi: 6230
Iscritto: 04/12/2003
|
Postato originariamente da Template:
a cosa ti dice il debugger |
O il linker, in questo caso.
|
|
Template (Member)
Pro
Messaggi: 177
Iscritto: 09/12/2015
|
Postato originariamente da pierotofy:
O il linker, in questo caso. |
Hai ragione
Purtroppo, la stanchezza fa sì che io ogni tanto sbagli termini |
|
nessuno (Normal User)
Guru^2
Messaggi: 6403
Iscritto: 03/01/2010
|
Hai sbagliato ben due volte ! Due punti in meno ....
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à. |
|
Template (Member)
Pro
Messaggi: 177
Iscritto: 09/12/2015
|
Me ne assumo la totale responsabilità... rileggendo quanto ho scritto mi sono accorto che in effetti l'errore è stato veramente indecente
|
|