View Full Version : [C++] overload di operatori
Salve a tutti, volevo sapere se c'è qualcuno che può aiutarmi con questo problema:
sto scrivendo un programma in c++ in cui ho definito alcune classi e ho fatto l'overload degli operatori << e >> per gli oggetti relativi a queste classi, ma quando compilo mi da errore: qui vi posto un pezzo del codice:
class data
{public:
int G;
int M;
int A;
data();
void stampa(ostream& dest)
{dest<<G<<"/"<<M<<"/"<<A;
return;
}
void leggi(istream& sorg)
{int giorno,mese,anno;
char sep='/';
sorg>>giorno>>sep>>mese>>sep>>anno;
G=giorno;
M=mese;
A=anno;
return;
}
}
class persona : public data
{public:
string NOME;
string COGNOME;
data NASCITA;
string RECAPITO;
string MAIL;
persona();
void stampa(ostream& dest)
{dest<<COGNOME<<endl<<NOME<<endl;
dest<<NASCITA;
dest<<endl<<RECAPITO<<endl<<MAIL<<endl<<endl;
return;
}
void leggi(istream& sorg)
{string name,surname,address,email;
data birth;
sorg>>name>>surname;
sorg>>birth;
sorg>>address>>email;
NOME=name;
COGNOME=surname;
NASCITA=birth;
RECAPITO=address;
MAIL=email;
return;
}
}
//altre classi e robe varie...
//poi fuori dalla definizione di qualsiasi classe e prima di aprire il main ho scritto:
ostream& operator<<(ostream& dest,const data& x)
{x.stampa(dest);
return dest;
}
istream& operator>>(istream& sorg,data& x)
{x.leggi(sorg);
return sorg;
}
ostream& operator<<(ostream& dest,const persona& x)
{x.stampa(dest);
return dest;
}
istream& operator>>(istream& sorg,persona& x)
{x.leggi(sorg);
return sorg;
}
a compile time mi da quest'errore:
no match for 'operator<<' in 'dest <<((persona)*this)->persona::NASCITA'
perchè??? Come devo fare per risolvere questo problema??
grazie in anticipo a chi risponde!!!!
La prossima volta intenda il codice, altrimenti non ci si capisce niente.
class data
{
public:
int G;
int M;
int A;
data();
void stampa(ostream& dest)
{
dest<<G<<"/"<<M<<"/"<<A;
return;
}
void leggi(istream& sorg)
{
int giorno,mese,anno;
char sep='/';
sorg>>giorno>>sep>>mese>>sep>>anno;
G=giorno;
M=mese;
A=anno;
return;
}
}
class persona : public data
{
public:
string NOME;
string COGNOME;
data NASCITA;
string RECAPITO;
string MAIL;
persona();
void stampa(ostream& dest)
{
dest<<COGNOME<<endl<<NOME<<endl;
dest<<NASCITA;
dest<<endl<<RECAPITO<<endl<<MAIL<<endl<<endl;
return;
}
void leggi(istream& sorg)
{
string name,surname,address,email;
data birth;
sorg>>name>>surname;
sorg>>birth;
sorg>>address>>email;
NOME=name;
COGNOME=surname;
NASCITA=birth;
RECAPITO=address;
MAIL=email;
return;
}
}
//altre classi e robe varie...
//poi fuori dalla definizione di qualsiasi classe e prima di aprire il main ho scritto:
ostream& operator<<(ostream& dest,const data& x)
{
x.stampa(dest);
return dest;
}
istream& operator>>(istream& sorg,data& x)
{
x.leggi(sorg);
return sorg;
}
ostream& operator<<(ostream& dest,const persona& x)
{
x.stampa(dest);
return dest;
}
istream& operator>>(istream& sorg,persona& x)
{
x.leggi(sorg);
return sorg;
}
Manca la parte di codice in cui avviene l'errore, è impossibile capirne il motivo :boh:
ok, hai ragione...
l'errore è relativo a questa riga della classe "persona", nella funzione "stampa":
dest<<NASCITA;
Sposta quegli operatori << prima della definizione delle classi.
Inoltre è buon uso non usare mai variabili membro maiuscolo. Per la lettura del codice ti consiglio anche di mettere uno spazio fra operatori e argomenti.
eh ho già provato a spostarli..
se li metto tra la classe "data" e quella "persona", continua a darmi l'errore precedente e in più, riferito alla riga:
ostream& operator<<(ostream& dest,const data& x)
mi da questo errore:
expected initializer before '&' token
Se invece li sposto tutti prima delle definizioni di tutte le classi mi da 8 errori in più rispetto a prima, tra cui:
expected ',' or '...' before '&' token e
ISO C++ forbids declaration of 'data' with no type e
'x' was not declared in this scope e
ambiguous overload for operator << (questo ritorna parecchie volte...)
Prima di tutto ti manca il ; dopo la parentesi chiusa di ogni classe.
A questo punto devi mettere il prototipo degli operatori sopra la dichiarazione delle classi e devi fare una "forward declaration" delle classi.
La forward declaration è una tecnica che permette di risolvere i casi in cui un simbolo viene usato prima della sua implementazione o dichiarazione. In questo caso infatti se sposti gli operatori sotto risulta non definito l'operatore, se li sposti sopra risultano non definite le classi.
Per fare una forward declaration ti basta mettere:
class data;
class persona;
prima del prototipo degli operatori.
beh innanzitutto grazie per l'aiuto e per la pazienza..
ho fatto come mi hai detto e così adesso la parte iniziale del codice è questa:
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
class data;
class persona;
ostream& operator<<(ostream& dest,const data& x)
{x.stampa(dest);
return dest;
};
istream& operator>>(istream& sorg,data& x)
{x.leggi(sorg);
return sorg;
};
e successivamente inziano le definizioni delle classi data e persona che ho già postato.
Adesso il compilatore non mi da più gli errori di prima, ma, riferito all'overload di <<:
1) invalid use of undefined type 'const struct data'
2)forward declaration of 'const struct data'
e uguale riferito all'overload di >>, ma con 'struct data'.
se tolgo il const dal parametro 'data' di << non cambia nulla, mentre se tolgo il '&' dallo stesso parametro oltre ai precedenti errori mi da anche:
'x' has incomplete type
quindi, questo benedetto parametro, come lo devo inserire??:confused: :confused:
Scusa l'insistenza e grazie ancora...
No, prima delle classi devi spostare solo il prototipo delle funzioni, l'implementazione la devi lasciare sotto le classi (altrimenti non ti trova i metodi che richiami visto che la forward declaration non dichiara alcun metodo). Cioè questi:
ostream& operator<<(ostream& dest,const data& x);
istream& operator>>(istream& sorg,data& x);
ostream& operator<<(ostream& dest,const persona& x);
istream& operator>>(istream& sorg,persona& x);
Nota che tutto si sarebbe risolto se avessi dichiarato lo classe prima dell'implementazione ;)
Ti sei dimenticato di implementare i costruttori.
grazie!! Adesso ho capito come devo fare...
solo un'ultima cosa: poi magari lo sistemo un po' meglio, ma implementato così, quando faccio 'build', il compilatore mi da:
process terminated with status 1 (0 minutes, 1 seconds)
0 errors, 0 warnings
evidenziato in rosso...
qualcosa mi dice che non è un bellissimo segnale...
eccolo.. ti ho messo solo l'errore perchè lo screenshot di tutto lo schermo pesava troppo...
Allora mi immagino che tu sia su Vista e stia usando Code::Blocks. Mi sa che è quello il famoso errore di cui tutti si lamentano :(
Installa Code::Blocks al posto di Dev-C++ (progetto vecchio e buggato all'inverosimile).
http://www.codeblocks.org/downloads/5
codeblocks-8.02mingw-setup.exe
d'oh!! Io ho installato code::blocks 8.02, compilatore MinGW e ho Windows XP!!
d'oh!! Io ho installato code::blocks 8.02, compilatore MinGW e ho Windows XP!!
Scusa, nella prima frase mi riferivo a Dev-C++, ma hos critto code::blocks :D
In effetti è strano che non ti funzioni.
Ma se premi il tasto "Play" non ti esegue il tuo programma ?
allora mi succede una cosa un po' strana, adesso cerco di spiegartela..
facendo 'build' come ti ho detto mi dava quell'errore e se poi facevo 'run' mi faceva partire un programmino di prova che avevo fatto appena avevo scaricato code::blocks; cioè una cosa che non c'entrava assolutamente nulla con questo programma.
Allora adesso ho cancellato l'intera cartella programmazione che ho sul desktop e in cui salvo tutti i file
.c
.o
.exe
relativi a code::blocks e l'ho ricreata, salvandoci solo il codice di questo programma. In questa cartella adesso c'è solo progetto.c
Adesso se faccio 'build' mi da lo stesso errore di prima, mentre se provo a fare 'run' mi esce questo messaggio:
it seems that this file has not been built yet.
Do you want to build it now?
Se faccio sì siamo da capo. Se invece faccio no mi si apre un eseguibile già terminato, cioè la classica finestra del programma con scritto
"process returned 0"
:help: :cry: :doh: :confused: :muro:
Ricordati che devi creare un nuovo progetto per ogni programma.
cioè devo fare "new project"?
Scusami come avrai capito sono decisamente un principiante, ma devo fare questo programma per un esame di programmazione e fino ad ora ho sempre e solo creato "empty file" (e salvando mi crea il file.c), poi facevo "build" (file.o) e "run" (file.exe)
(se non sbaglio)...
:D
Certo, New -> Project -> Console Application -> Ok -> scegli C++ -> inserisic il nome del progetto ed il percorso -> vaia vanti fino in fondo.
fatto.. dopo devo inserire il codice del programma nella cartella del progetto?
No, ti dovrebbe aver creato un file .cpp già inserito nel progetto, giusto ? Inserisci dentro quel file il tuo codice.
Se vuoi inserire un file già esistente nel progetto, seleziona il nome del progetto (sulla sinistra sotto a workspace), tasto destro sopra il nome del progetto, aggiungi un file, selezioni il nome del file (meglio metterlo nella directory del progetto).
Se invece vuoi creare un nuovo file da inserire nel progetto: File -> New -> File, selezioni il tipo di file -> per inserire il nome del file clicki sul pulsante accanto al nome del file, immetti il nome, ok e poi selezioni All (Debug e Release sono due le due configurazioni attive per il progetto, una ti permette di eseguire il debug dell'applicazione, l'altra è ottimizzata per la distribuzione dell'eseguibile finale).
ok ho fatto tutto.. nel progetto mi aveva creato un file (main.cpp) nel quale ho copiato il mio codice... ed è uguale a prima, mi da lo stesso problema...:cry:
Prova premendo l'ingranaggio accanto al "Play", copia qui il risultato che ti fa vedere in Build Log.
Prova a non inserire lo spazio nei nomi dei file e del progetto, non è assolutamente buona norma inserire spazi in questi casi.
ho rifatto tutto denominando il progetto "archivio" invece che "archivio studenti"...
niente da fare, tutto come prima... o comunque già adesso grazie davvero per l'interessamento, tra poco provo a farlo andare sul portatile di un mio amico che ha anche lui code::blocks uguale al mio.. ha Vista, e non credo che su quel sistema operativo qualcosa possa andare "meglio" che da qualche altra parte, però tentar non nuoce...
:boh: sinceramente non so quale possa essere il problema.
Prova a mettere nel path la directory di mingw.
ho controllato il path ed è quello giusto..
e in più non è neanche il solito problema di vista: sul computer del mio amico abbiamo installato code::blocks con la stessa versione e lo stesso compilatore, l'abbiamo settato così da risolvere proprio quel classico problema e infatti i programmini di prova che abbiamo fatto li ha compilati e funzionavano..
ma quando ho fatto un progetto con un file col codice del mio programma da il solito errore.. mi da veramente sui nervi, non so come fare...
Cioè anche su Vista non compila solo il tuo programma mentre gli altri sì ?
sì, il che mi fa pensare che ci sia un qualcosa che non va nel programma, però il compilatore non mi sa dire cos'è questo qualcosa.. uffa...
Il mio code::blocks compila tutti i singoli file (cioè anche se faccio semplicemente "new empty file") e tutti i file associati a un progetto, meno che, ovviamente, il programma in questione;
quello del mio amico non compila i singoli file, ma se faccio come mi hai spiegato, cioè se creo un nuovo progetto i file che ne fanno parte li compila! Meno che, ovviamente, il programma suddetto...
C'è più aria di x-files che di c++.......
Ci sta che sia finito qualche carattere strano all'interno del codice. Allega il codice.
Confermo anche io il problema, sembra un bug del compilatore. Forse sono i riferimenti incrociati che lo mandano in crisi. Prova a verificare meglio.
Prova a creare dei file .h che contengono solamente la dichiarazione delle due classi, metti un altro file .h, che include i primi due, con la dichiarazione degli operatori.
Implementa le classi in altrettanti file .cpp e così anche gli operatori.
su queste ultime cose mi perdo proprio, ho anche provato a scasinarci un po' ma non le abbiamo mai fatte a lezione e se posso le eviterei...
piuttosto se provassi a fare un passo indietro...
Nota che tutto si sarebbe risolto se avessi dichiarato lo classe prima dell'implementazione ;)
Ti sei dimenticato di implementare i costruttori.
cioè come dovrei implementarli??
Le classi in C++ le puoi dichiarare prima di implementarle. Questa è una dichiarazione:
class data
{
public:
int G;
int M;
int A;
data();
void stampa(ostream& dest);
void leggi(istream& sorg);
};
Per l'implementazione:
data::data()
{
}
void data::stampa(ostream& dest)
{
dest<<G<<"/"<<M<<"/"<<A;
return;
}
void data::leggi(istream& sorg)
{
int giorno,mese,anno;
char sep='/';
sorg>>giorno>>sep>>mese>>sep>>anno;
G=giorno;
M=mese;
A=anno;
return;
}
Comunque mi sembra strano che non te lo abbiano insegnato.
In questo modo eviti di dover usare le forward declaration.
ah no ok.. non avevo capito cosa intendevi ma questo ce l'hanno spiegato.. mo provo..
niente, ho provato anche questa ma continua a darmi lo stesso errore.. ma c'è una qualche maniera in cui cambiando l'implementazione posso ottenere un qualche risultato o l'unica alternativa che mi rimane a questo punto è provare a scaricare un altro compilatore?!?!
niente, ho provato anche questa ma continua a darmi lo stesso errore.. ma c'è una qualche maniera in cui cambiando l'implementazione posso ottenere un qualche risultato o l'unica alternativa che mi rimane a questo punto è provare a scaricare un altro compilatore?!?!
Mi sembra strano. Allega il codice modificato.
??:rolleyes:
Sinceramente mi continua a dare lo stesso problema...chissà cos'è che gli da noia.
Lo stesso problema c'è anche da linea di comando.
Prova a scrivere prima la dichiarazione di tutte le classi e l'implementazione la metti dopo.
Gli operatori << mettili dopo l'implementazione di tutte le classi.
Il bello è che togliendo i primi due operatori << su data funziona tutto.
Uffa, a parole viene troppo lunga, ma tanto, purtroppo, la sostanza è quella..
DC: dichiarazione di tutte le classi;
IC: implementazione di tutte le classi;
DO: dichiarazione di tutti gli overload;
IO: implemetazione di tutti gli overload;
mi da sempre lo stesso stramaledettissimo errore sia che io li ordini così:
1)DC
2)DO
3)IC
4)IO
sia che io invece li ordini così:
1)DC
2)IC
3)DO-IO
A meno che tu non sappia di qualche altra tecnica da provare, secondo te come potrei procedere?
Cambia compilatore. Prova con Visual C++ Express: http://www.microsoft.com/express/vc/Default.aspx
Incollami l'ultimo codice, provo a segnalare il bug o magari a scaricare la versione alpha di mingw 4.1.
eccolo, grazie mille intanto, adesso provo con quest'altro compilatore..
eccomi di nuovo.. mi spiace ma con visual c++ veramente non ci ho capito nulla, quindi ci ho rinunciato e come l'ho scaricato l'ho pure disinstallato (ammesso che ci sia riuscito)...
ho scaricato il compilatore Borland C++ 5.5 e, magia delle magie, mi fa la stessa identica cosa!!!!!!! Non ci potevo credere... se non altro però, il solito fatidico messaggio è preceduto da qualche spiegazione aggiuntiva che spero possa essere di aiuto:
Compiling: C:\Documents and Settings\Stefano\Desktop\programmazione\provom2.c
C:\Documents and Settings\Stefano\Desktop\programmazione\provom2.c:
Fatal F1003 C:\Programmi\Borland\BCC55\Include\stdcomp.h 5: Error directive: Must use C++ for STDCOMP.H
*** 1 errors in Compile ***
Process terminated with status 1 (0 minutes, 0 seconds)
0 errors, 0 warnings
idee?
eh eh ci avevo già provato...
in effetti no, però mi da 26 errori e 1 warning...
provom2.cpp 18: Too many types in declaration
provom2.cpp 29: Too many types in declaration
provom2.cpp 38: Too many types in declaration
provom2.cpp 49: Too many types in declaration
provom2.cpp 61: Too many types in declaration
provom2.cpp 74: Too many types in declaration
provom2.cpp 86: Too many types in declaration
provom2.cpp 97: Too many types in declaration
provom2.cpp 98: Type 'esami' may not be defined here
provom2.cpp 98: 'data::stampa(ostream &)' is not a member of 'data'
provom2.cpp 112: 'operator<<' not implemented in type 'ostream' for arguments of type 'data' in function persona::stampa(ostream &)
provom2.cpp 120: 'operator>>' not implemented in type 'istream' for arguments of type 'data' in function persona::leggi(istream &)
provom2.cpp 130: 'operator<<' not implemented in type 'ostream' for arguments of type 'persona' in function studente::stampa(ostream &)
provom2.cpp 137: 'operator>>' not implemented in type 'istream' for arguments of type 'persona' in function studente::leggi(istream &)
provom2.cpp 146: 'operator<<' not implemented in type 'ostream' for arguments of type 'data' in function esame::stampa(ostream &)
provom2.cpp 154: 'operator>>' not implemented in type 'istream' for arguments of type 'data' in function esame::leggi(istream &)
provom2.cpp 194: Undefined symbol 'quit' in function studenti::trova()
provom2.cpp 196: Undefined symbol 'n' in function studenti::trova()
provom2.cpp 203: Structure required on left side of . or .* in function studenti::cancella()
provom2.cpp 205: 'operator<<' not implemented in type 'ostream' for arguments of type 'studente' in function studenti::cancella()
provom2.cpp 219: Structure required on left side of . or .* in function studenti::modifica()
provom2.cpp 223: 'operator<<' not implemented in type 'ostream' for arguments of type 'studente' in function studenti::modifica()
provom2.cpp 250: Structure required on left side of . or .* in function studenti::ricerca()
provom2.cpp 251: 'operator<<' not implemented in type 'ostream' for arguments of type 'studente' in function studenti::ricerca()
Warning provom2.cpp 260: Comparing signed and unsigned values in function studenti::ricerca()
provom2.cpp 261: 'operator<<' not implemented in type 'ostream' for arguments of type 'studente' in function studenti::ricerca()
provom2.cpp 261: Too many error or warning messages in function studenti::ricerca()
*** 26 errors in Compile ***
ok, i primi 10 li ho risolti coi punti e virgola...:D :D
anche se il build log continua a darmene 26 di errori, saranno spuntati da qualche altra parte... mah...
ok, almeno adesso il compilatore mi dice dove trova degli errori... grazie a tutti!!
eccomi di nuovo.. mi spiace ma con visual c++ veramente non ci ho capito nulla, quindi ci ho rinunciato e come l'ho scaricato l'ho pure disinstallato (ammesso che ci sia riuscito)...
ho scaricato il compilatore Borland C++ 5.5 e, magia delle magie, mi fa la stessa identica cosa!!!!!!! Non ci potevo credere... se non altro però, il solito fatidico messaggio è preceduto da qualche spiegazione aggiuntiva che spero possa essere di aiuto:
Compiling: C:\Documents and Settings\Stefano\Desktop\programmazione\provom2.c
C:\Documents and Settings\Stefano\Desktop\programmazione\provom2.c:
Fatal F1003 C:\Programmi\Borland\BCC55\Include\stdcomp.h 5: Error directive: Must use C++ for STDCOMP.H
*** 1 errors in Compile ***
Process terminated with status 1 (0 minutes, 0 seconds)
0 errors, 0 warnings
idee?
Questo è un altro errore. Qui l'errore si vede ed è ben scritto sopra. Sinceramente non so cosa sia questo stdcomp.h.
bene.. come detto ho salvato il file come .cpp e il compilatore mi ha dato 26 errori e un tot di warnings...
ho messo a posto il tutto e così adesso ci sono 0 errori e mi sono rimasti 7 warnings...
Ora, premesso che ho chiamato il file "provom2":
quando faccio build, il build log mi da, dopo un'interminabile sequenza di messaggi di questo tipo:
Error: Unresolved External '__(nomi vari...)__' referenced from C:\PROGRAMMI\BORLAND\BCC55\LIB\C0X32.OBJ
una simpatica variante del precedente errore:
Process terminated with status 2 (0 minutes, 2 seconds)
0 errors, 7 warnings
e, per rendere ancora un po' più divertente la faccenda, mi succede questo: nello stesso istante in cui il compilatore mi da questo messaggio mi si apre una finestra dell'antivirus che mi dice che "provom2.exe" è un Trojan.
Posto che non sapevo che il progetto che il prof mi ha dato da fare per l'esame fosse in realtà un virus, mi chiedo dove abbia trovato l'antivirus l'eseguibile, dato che nella cartella "programmazione" dove me l'avrebbe dovuto creare ci sono adesso
provom2.ilc
provom2.ild
provom2.ilf
provom2.ils
provom2.obj
provom2.tds
provom2.map
ma neanche uno straccio d'ombra di file .exe....
un po' prolisso, ma spero di aver reso l'idea..
mi dica dottore, il paziente è così grave?????
Error: Unresolved External '__(nomi vari...)__' referenced from C:\PROGRAMMI\BORLAND\BCC55\LIB\C0X32.OBJ
una simpatica variante del precedente errore:
Process terminated with status 2 (0 minutes, 2 seconds)
0 errors, 7 warnings
L'ultimo non è un errore, è semplicemente il riepilogo.
Senza i nomi vari non possiamo aiutarti.
PS: hai creato un progetto console ?
cavolo hai ragione..
ho creato il progetto console, adesso mi da
process terminated with status 2
ma niente antivirus e soprattutto la lista dei nomi vari si è ridotta ai soli costruttori delle classi:
Error: Unresolved external 'studenti::studenti()' referenced from C:\DOCUMENTS AND SETTINGS\STEFANO\DESKTOP\PROGRAMMAZIONE\PROJECT\OBJ\DEBUG\MAIN.OBJ
Error: Unresolved external 'insegnamenti::insegnamenti()' referenced from C:\DOCUMENTS AND SETTINGS\STEFANO\DESKTOP\PROGRAMMAZIONE\PROJECT\OBJ\DEBUG\MAIN.OBJ
Error: Unresolved external 'esami::esami()' referenced from C:\DOCUMENTS AND SETTINGS\STEFANO\DESKTOP\PROGRAMMAZIONE\PROJECT\OBJ\DEBUG\MAIN.OBJ
Error: Unresolved external 'persona::persona()' referenced from C:\DOCUMENTS AND SETTINGS\STEFANO\DESKTOP\PROGRAMMAZIONE\PROJECT\OBJ\DEBUG\MAIN.OBJ
Error: Unresolved external 'data::data()' referenced from C:\DOCUMENTS AND SETTINGS\STEFANO\DESKTOP\PROGRAMMAZIONE\PROJECT\OBJ\DEBUG\MAIN.OBJ
Che sono tutti i costruttori che non hai implementato.
ragazzi, non ci credo, funziona. Cioè, funziona, me l'ha compilato e mi ha creato il .exe.. poi a quanto pare dovrò mettere a posto ancora un po' di cose dato che l'interazione del programma con l'utente è:
Process returned -1073741819(0xC0000005)
ma da qui spero proprio di potermela cavare... grazie!!!!!!!!!!!
ehm... come dire... dietrofront!
Non capisco bene neanche questo problema..
ho scritto il codice di questo programma che è stato compilato e di cui è stato creato il .exe;
quando però faccio "run" mi esce immediatamente questo messaggio:
Process terminated with status -1073741819 (0x000000C) execution time:0.031 s
Press any key to continue
Secondo voi a quale errore potrebbe essere dovuto questo messaggio?
Non è un errore, o almeno non ce n'è uno evidente. Semplicemente il main termina l'esecuzione.
Metti un return 0 in fondo al main, così se lo status è 0 capisci che arriva in fondo al main.
return 0 alla fine della main c'era già, è per quello che credo che ci debba essere un qualche errore, perchè non riesce ad arrivare alla fine del main ma per qualche motivo l'esecuzione si ferma prima...
return 0 alla fine della main c'era già, è per quello che credo che ci debba essere un qualche errore, perchè non riesce ad arrivare alla fine del main ma per qualche motivo l'esecuzione si ferma prima...
Usa il debugger e vedi dove si ferma l'esecuzione...
d'oh.. ho scaricato solo il compiler di borland 5.5 c++!
mi consigli da dove scaricare il debugger?
Mi dispiace, ma con il borland non ti so aiutare.
eccomi qua dopo lungo tempo...
ho scaricato la versione aggiornata di MinGW e aggiustando un paio di cose nel codice funziona, ma ovviamente i problemi non possono essere finiti qua:
1) adesso nella cartella lib di MinGW non c'è più un'applicazione il cui nome assomigli a 'gdb.exe' --> non so quale sia il debugger
2)adesso quando eseguo il programma mi da quest'errore mi si apre la finestra dell'eseguibile ma compare subito questa scritta:
Process returned -1073741819 (0xC0000005)
qualcuno sa aiutarmi??
Quel messaggio non aggiunge alcun significato alla causa dell'errore.
Da dove hai scaricato gcc aggiornato ? Ci dovrebbe essere anche gdb nello stesso sito.
eh l'ho cercato ma non lo trovo! ho scaricato il file "mingw-4.0.zip" da questo sito: http://nuwen.net/mingw.html
in fondo ne parla anche del debugger e consiglia quello di MSVC piuttosto che gdb, ma io non riesco a trovare nè l'uno nè l'altro!!:cry:
Quella è, diciamo, una distribuzione alternativa di Mingw. Quella ufficiale è qui: http://sourceforge.net/project/showfiles.php?group_id=2435
scusca l'ignoranza completa ma ho scaricato il gdb6.8.3 dal sito che mi hai detto.. e ho una cartella con una quantità disumana di file in cui non trovo un'applicazione... mi sapresti spiegare per sommi capi come devo fare per configurarlo??
Hai scaricato il file sbagliato: http://downloads.sourceforge.net/mingw/gdb-6.8-mingw-3.tar.bz2?modtime=1208982015&big_mirror=1
Lo devi estrarre dove ti trovi già quelle directory.
ciao, scusa se ci ho messo un po' a rispondere ma per qualche giorno mi sono dovuto immergere nello studio per un altro esame...
ricapitolando la situazione: progetto con code::blocks, compilatore minGw 4.2.1 (o comunque la versione aggiornata che ho scaricato dal sito che mi hai detto) (con debugger:D ).
Allora il programma è stato compilato senza errori nè warnings. Durante l'esecuzione del main deve leggere in input da 3 file: sono sicuro che quantomeno l'esecuzione parta perchè se non metto i 3 file nella cartella del progetto (e conseguentemente il programma non li riesce a trovare) ottengo in output
"file studenti.txt non trovato!"
come "gli ho detto di fare" se falliva il collegamento in input col file.
Se però metto i 3 file nella cartella giusta, nella finestra dell'eseguibile compare subito questa scritta:
Process terminated with status -1073741819 (0x000000C) execution time:0.031 s
Press any key to continue
e nel build log questa:
Process terminated with status -1073741819 (0 minutes, 14 seconds)
L'unico passo avanti adesso è dato dal fatto che ho il debugger: facendolo partire ottengo nella finestra in basso del debugger:
Building to ensure sources are up-to-date
Build succeeded
Selecting target:
Debug
Adding source dir: C:\Documents and Settings\Stefano\Desktop\programmazione\celafaro\
Adding source dir: C:\Documents and Settings\Stefano\Desktop\programmazione\celafaro\
Adding file: bin\Debug\celafaro.exe
Starting debugger:
done
Registered new type: wxString
Registered new type: STL String
Registered new type: STL Vector
Setting breakpoints
Debugger name and version: GNU gdb 6.8
Child process PID: 1264
e a questo punto mi compare questo messaggio:
Program received signal SIGSEGV, Segmentation fault.
Do you want to view the backtrace?
Facendo sì mi si apre una finestrella di "nome" "Call Stack" che riporta:
Nr 0
Address 0045A4C6
Function std::string::operator=()
e alla lista delle operazioni del debugger di prima si aggiungono queste due righe:
Program received signal SIGSEGV, Segmentation fault.
In std::string::operator= () ()
Questo è dettagliatamente il problema. Idee?
E' un'errore nell'uso delle string...
Non è possibile capire il problema senza vedere il codice. Metti un break point e segui l'esecuzione passo passo (guarda il menu debug di Code::Blocks) per capire l'istruzione che genera l'errore.
il breakpoint è posizionato alla riga della prima istruzione del main.
Quello che non capisco è che la prima istruzione del main è la dichiarazione di un oggetto (di nome S) di classe studenti che ho precedentemente definito nel codice come derivata da altre, ecc, ecc.. e il breakpoint è posizionato sulla riga di quella dichiarazione. Ora come ti ho detto però se io levo i 3 file dalla cartella del progetto il programma procede come è normale che proceda, e il debugger non segnala nessuna anomalia. Cioè, se il problema fosse sulla classe studenti o su un qualche suo membro, non dovrebbe rilevarlo in entrambi i casi (cioè sia che i file siano nella cartella o meno)?
Se invece c'è differenza tra questi due casi, il breakpoint non dovrebbe essere posizionato sull'istruzione di lettura da file?
Una volta settato il breakpoint non devi eseguire normalmente il programma, ma far partire l'esecuzione dal menu debug.
oh tutte le volte che riscrivo su questo forum convinto di aver capito qualcosa mi accorgo di aver inanellato una serie di nuove boiate:doh:
il primo punto in cui si ferma il debugger è dal costruttore senza parametri (che è poi anche l'unico costruttore che ci ho messo) della prima classe (classe data): l'ho implementato, in modo che tutte le volte che creo un oggetto di tipo data assegni al campo G (=giorno) 1, al campo M (=mese) 1 e al campo A (=anno) 1901.
Ora le cose che non capisco sono 2: dove sia il problema con questo costruttore e cosa questo problema possa aver a che fare con le stringhe...:confused:
grazie ancora e scusa il casino...
class data
{public:
int G;
int M;
int A;
data()
{G=1;
M=1;
A=1901;
};
void stampa(ostream& dest);
void leggi(istream& sorg);
friend class persona;
friend class esame;
};
Se può essere utile questo è il codice esatto relativo alla classe data..
Ora le cose che non capisco sono 2: dove sia il problema con questo costruttore e cosa questo problema possa aver a che fare con le stringhe...:confused:
grazie ancora e scusa il casino...
Ti spiego come funziona il debugger: il debugger non si ferma dove c'è un errrore, ma dove tu gli dici di fermarsi. Se metti un breakpoin e poi fai partire l'esecuzione dal menu debug, il debugger ti si ferma sul primo breakpoint che incontra nel flusso di esecuzione.
Se premi nuovamente DEbug -> Start si fermerà al successivo breakpoint.
Se premi Next line ti eseguirà la linea corrente fino alla prossima.
Se premi Step into ti fa vedere nel dettaglio cosa viene eseguito alla linea corrente. Se ad esempio hai una chiamata a metodo ti entra dentro al metodo.
Stop out ti eseguire fino a ritornare al chiamante del metodo/funzione corrente.
Il debugger in sostanza non ti trova gli errori da solo...sei tu a doverli cercare seguendo passo-passo l'esecuzione e cercando di capire cosa succede nel codice. Hai anche lo strumento watch che ti permette di visualizzare il valore delle variabili immettendone il nome.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.