Newsgroup: it.comp.lang.c++
Titolo: abmormal program termination Try/catch

Ciao ragazzi.
Sono da poco passato da java a c++. Mi sono imbattuto in un problema,
probabilmente, di sintassi. Ho costruito una classe Vector che contiene una
array di interi, per cui i files vector.h e vector.cpp, e un programma per
testare il funzionamento sul file main.cpp. Tutto funzionva bene, peró,
siccome ho fatto un overloading dell'operatore[], volevo accertarmi del
fatto che l'accesso agli interi dell'array fosse contenuto nei limiti della
grandezza dell'array.
Su vector.h ho tra l'altro:
 int& operator[](int index) throw(char*);
Su vector.cpp ho:
int& Vector::operator[](int index) throw(char*){
 if(index<number || index>number)
  throw "ERROR";
  return arr[index];
}
Infine in main ho:
 try{
   Vector v(10);
   v[0]=11;
   v[1]=12;
   cout<<v[0]<<endl;
   cout<<v[1]<<endl;
  }
  catch(char* String){
   cout << String << endl;
      return -1;
 }
Il fatto é che non c'é nessun errore nel codice, nel senso che l'esecuzione
non dov´rebbe generare eccezioni. Eppure quando lo eseguo mi esce il
messaggio:
"abmormal program termination "
Qualcuno sa dirmi dove é l'errore? E di che tipo di errore si tratta?
Grazie
\alf

 "abmormal program termination "
Ci puoi postare il codice del costruttore? Altrimenti è impossibile capire
dove sia il problema.
Ciao!
Azathot


Comunque il problena l'ho trovato
if(index<number || index>number)
 throw "ERROR";
 index<number || index>number. Logico eh?
Grazie comunque
\alf

 Grazie comunque
Quello era gia' stato notato, ma non c'entra col fatto che il programma ti
restituisse una "abnormal program termination".
Oppure prima di questa scritta vedevi anche la scritta "ERROR" ?
Maurus

 costruire ed usare un Vector "artigianale" :-DD
D'accordo. Però anche i tutorial più scrausi mettono l'accento sul fatto
che per programmare in C++ devi conoscere l'STL.
Azathot ... che però si domanda cosa succede se fai v[ -1 ] ...


\alf


\alf


Allora il problema sta ancora li', solo che con la tua modifica non lo fai
piu' entrare nel blocco della catch,
prova a far risollevare un'eccezione per rientrare nella stessa catch, ad
esempio facendo un assegnamento a un indice piu' grande del dovuto nel tuo
vettore.
Maurus

 facendo v[-1] non mi dovrebbe generare l'eccezione?
Appunto. Vorrei sapere cosa fa il programma...
Ciao!
Azathot ... che si domanda quale ciclo di vita abbia "ERROR" ...

 skrev i meddelandet
news:b1ok4t$15bs32$1...@ID-125555.news.dfncis.de...

Si proprio come dici. Alla fine del try faccio v[-1] e sul prompt mi esce
prima le scritte eseguite dal codice giusto(esempio: cout<<v[1]) e poi mi
esce di nuovo abnormal program termination. Hai idea cosa possa essere?
\alf


A questo punto penso che abbia ragione il nostro Azimuth, che il ciclo di
vita di "ERROR" di cui si fa il throw nell'operator [], non dura al momento
in cui nel main si fa la catch.
Per cui invece di fare throw "ERROR"; prova a fare throw strError; dove
strError e' una std::string dichiarata cosi' in vector.cpp:
//vector.cpp
//prima includi anche <string>
#include <string>
std::string strError("ERROR");
// operator []
.....
throw strError;
e poi nel main cambi :
// main.cpp
#include <string>
catch(std::string String){
   cout << String << endl;
      return -1;
Maurus

 skrev i meddelandet
news:b1ome7$12g8lb$1...@ID-125555.news.dfncis.de...

Ok, l'alternativa da te indicata va sicuramente bene. Comunque credo di aver
scovato l'impiccio. Sia in vector.h che in vector.cpp ho dichiarato :
 int& operator[](int index) throw(const char*);
Cioé ho detto che l'argomento di throw é una const char*
In main avevo invece:
catch(char* String)
Cambiando l'argomento con "const char* String" mi funziona. Adesso,
eseguendo  v[-1]  il programma stampa "ERRORE". Forse questo particolare non
l'avevo fatto notare nelle lettere precedenti. Grazie comunque.
\alf

 esce di nuovo abnormal program termination. Hai idea cosa possa essere?
Un hint: forse sarebbe il caso di lanciare l'eccezione con un puntatore la
cui memoria č allocata nell'heap?
Tipo:
	throw( strdup( "ERROR" ) );
...
	catch( char * _e ) {
		free( _e );
	}
...
O, in forma piů C++-like:
#include <stdexecpt>
...
	throw( new out_of_range( "ERROR" ) );
...
	catch( out_of_range * _e ) {
		cout << _e->what() << endl;
		delete _e;
	}
...
Ciao!
Azathot

 di
Lo correggo: Azathot.
Azimuth, per l'ennesima volta, non so chi sia.
Azathot