Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    3

    c++ exceptions e error()... serve aiuto

    Ciao a tutti, è la prima volta che scrivo in questo forum, sto imparando a programmare e faccio riferimento al testo di stroustrup "programming principles and practice using c++". Utilizzo un mac con OSX 10.6.5, e compilo con g++ (i686-apple-darwin10-g++-4.2.1). Il file che includo ("std_lib_facilities.h") si trova qui sul sito di stroustrup.

    Sono al capitolo degli errori (cap 5) e ho dei problemi con la gestione delle eccezioni. Ad esempio: nel seguente codice se inserisco un valore non int esce senza darmi il "bad input" che gli chiedo. Qualcuno sa dirmi perché e come risolvere la faccenda?

    codice:
    #include "../std_lib_facilities.h"
    
    int main()
    {
    	vector<int>v;
    	int i;
    	while (cin>>i)
    	{
    		if(cin) 
    		v.push_back(i); //inserisco i valori nel vettore
    		else error("bad input\n");
    	}
    		for (i=0;i<v.size(); ++i) // 
    			cout<<"v["<<i<<"] == "<<v[i]<<endl;
    }
    Non capisco da cosa possa dipendere

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Se inserisci un valore non int il cin diventa non valido già da questa riga:
    codice:
    while (cin>>i)
    rendendo superfluo il codice di controllo.

    L'operatore >> estrae il valore richiesto e poi restituisce il cin stesso. Questo cin poi viene confrontato nel while ed essendo non valido, fallisce il confronto boolenano ed esce.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    3
    Grazie della risposta ma...
    se il programma esce sul
    codice:
    while(cin>>i)
    come faccio a inserire un controllo sui dati inseriti? Io voglio sapere che esce perché ho inserito un non int... c'è modo?
    *********************
    mac OS X 10.6.5
    g++ 4.2.1
    *********************

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Certo. Basta usare un costrutto leggermente diverso:

    codice:
    int main() {
    
    	vector<int>v;
    	int i;
    	do 
    	{
    		cin >> i;
    		if(cin) 
    		v.push_back(i); //inserisco i valori nel vettore
    		else error("bad input\n");
    
    	} while (cin);
    
    		for (i=0;i<v.size(); ++i) // 
    			cout<<"v["<<i<<"] == "<<v[i]<<endl;
    }
    Prima fai l'estrazine del dato, poi il controllo.
    Nota però che dal ciclo puoi uscire solo quando viene sollevata l'eccezione (quindi in teoria anche mai). Per un codice didattico questo non è un problema, ma dovresti pensare a un modo per uscire in modo pulito (ad esempio imponendo un numero massimo di inserimenti).
    Nota anche che in caso di errore non c'è nulla che intercetti l'eccezione (non c'è il blocco try - catch necessario) quindi il programma esce e basta senza dire la causa.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    3
    grazie, quindi potrei risolvere con un ciclo for a monte del do {} while... noooooo!

    ok, risolto così

    codice:
    int main() 
    try{
    	
    	vector<int>v;
    	int i,n;
    
    	for (n=0;n<10; ++n) {
    	
    		cin >> i;
    		if(cin) 
    			v.push_back(i); //inserisco i valori nel vettore
    		else error("bad input\n");
    		
    	} 
    	
    	for (i=0;i<v.size(); ++i) // 
    		cout<<"v["<<i<<"] == "<<v[i]<<endl;
    	}catch (exception& e) {
    		cerr<<"eccezione: "<<e.what()<<endl;
    	}
    Grazie!! finalmente (!!!) ho capito che error() restituisce una stringa che poi viene catchata. Non ho ancora del tutto chiaro i dettagli, ma è già un grande passo avanti!
    *********************
    mac OS X 10.6.5
    g++ 4.2.1
    *********************

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.