Oppure

Loading
19/04/16 20:13
Vignus
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:

#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? :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 ;)
aaa
19/04/16 20:30
Programmare significa fare MOLTA attenzione ...

svuota

e

svouta

sono parole diverse ...
19/04/16 23:00
Template
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 19/04/16 23:03
aaa
20/04/16 18:58
Vignus
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:
aaa
20/04/16 20:53
Template
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 ;)
aaa
21/04/16 3:21
pierotofy
Postato originariamente da Template:
a cosa ti dice il debugger


O il linker, in questo caso.
Il mio blog: piero.dev
21/04/16 6:06
Template
Postato originariamente da pierotofy:

O il linker, in questo caso.


Hai ragione :rotfl:
Purtroppo, la stanchezza fa sì che io ogni tanto sbagli termini
aaa
21/04/16 6:53
Hai sbagliato ben due volte ! Due punti in meno .... :yup: