Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1

    [C++] necessario spezzare cout

    salve, sono alle prime armi con il c++, anche se il problema che ho riscontrato non penso dipenda da quello.

    io ho un primo sorgente ( http://gnuwes.tuxfamily.org/test/coboldo.cpp ) nel quale, al momento di inserire il valore m, se inserito un valore fuori range ( >INT_MAX o <INT_MIN oppure un tipo di dato non adatto a m che è int) , sembra che salti il controllo e passa a leggere n, tranne poi fermarsi subito e stampare il messaggio di errore di n .

    nel secondo sorgente, invece (http://gnuwes.tuxfamily.org/test/coboldo1.cpp), che differisce dal primo solo ed esclusivamente per il fatto che l'ultimissimo cout è spezzato in due righe, tutto funziona a dovere.

    se metto un cout<<m; dopo il cin >>m; ritorna un valore del tipo 4197728 , che è interno al range.
    in soldoni, sembra che legga solo una parte di m e l'altra parte la legga insieme a n, che ovviamente va fuori range.


    il problema è che non capisco che influenza possa avere in questi termini l'ultimissimo cout, che viene chiamato in causa molto più avanti.

    qualcuno ha qualche idea?

  2. #2
    Scusa ma non vedo alcuna differenza nell'ultimissimo cout dei i due file.

    Piuttosto non mi convince il controllo dei range (non identico, ma forse equivalente) tra i due file.
    Considera che
    codice:
    INT_MAX + 1 == INT_MIN;
    e che analogamente
    codice:
    INT_MIN - 1 == INT_MAX;
    Insomma il controllo del range delegalo ad una funzione, e "testala" a dovere.

  3. #3
    hai ragione, avevo sbagliato ad uppare i file.
    il controllo è giusto, e inoltre non posso cambiarlo per consegna.
    non mi interessa se ci sono altri modi per fare il programma, purtroppo così mi è stato detto di farlo e così l'ho fatto.
    però voglio capire il malfunzionamento.
    prova a ricontrollare i link, li ho messi a posto.
    programma 1, con l'errore:
    http://gnuwes.tuxfamily.org/test/prog.err.cpp

    programma 2, che differisce da 1 solo per l'ultimo cout, e funziona a dovere:
    http://gnuwes.tuxfamily.org/test/prog.cpp



  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2006
    Messaggi
    46
    Il programma funziona..oppure ho capito male io?
    io ho provato ad inserire m=0 e il programma è uscito,proprio come da codice...
    ho scaricato prog.err.cpp dell'ultimo post...

  5. #5
    Ho provato sia con prog.cpp che con prog.err.cpp in modalità debug e no, ed ho il seguente output, inserendo 2147483648:
    codice:
    mbp:~/development/console/test ig$ g++ -Wall -O4 prog.err.cpp -o prog.err.out
    mbp:~/development/console/test ig$ ./prog.err.out 
    inserisci un numero m maggiore di zero e minore di 2147483647
    2147483648
    errore. m fuori range
    mbp:~/development/console/test ig$ g++ --version
    i686-apple-darwin8-g++-4.0.1 (GCC) 4.0.1 (Apple Computer, Inc. build 5367)
    mbp:~/development/console/test ig$ uname -a  
    Darwin mbp.local 8.11.1 Darwin Kernel Version 8.11.1: Wed Oct 10 18:23:28 PDT 2007; root:xnu-792.25.20~1/RELEASE_I386 i386 i386
    Penso potrebbe essere utile se rivelassi un output mostrante l'errore, la versione del tuo compilatore e del tuo SO, oltre le opzioni di compilazioni utilizzate.

  6. #6
    codice:
    [daniel@archer64 Desktop]$ g++ prog.err.cpp -o prog.err
    [daniel@archer64 Desktop]$ ./prog.err
    inserisci un numero m maggiore di zero e minore di 2147483647
    2147483648
    inserisci un numero n maggiore di zero e minore o uguale a 100
    errore. n fuori range
    [daniel@archer64 Desktop]$ g++ --version
    g++ (GCC) 4.2.2
    Copyright (C) 2007 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    
    [daniel@archer64 Desktop]$ uname -a
    Linux archer64 2.6.23-ARCH #1 SMP PREEMPT Sat Oct 27 10:52:38 CEST 2007 x86_64 AMD Turion(tm) 64 X2 Mobile Technology TL-56 AuthenticAMD GNU/Linux
    provato anche con g++ (GCC) 3.3.4 , all'uni, identico comportamento.

    (oNaSsI$, il programma funziona, in sè, rileggi il primo post..)

  7. #7
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Io con il borland ottengo risultati diversi.

    Ma quell'if per come è scritto non serve a nulla. L'unica condizione che può verificarsi è (m<=0), le altre sono sempre false.

    Per quanto riguarda il cin è normale che vada in errore quando si sbagli a inserire il dato.
    Per risolvere puoi mettere queste due righe dopo l'if.

    cin.clear();
    cin.ignore(INT_MAX,'\n');

    Per inciso, sbagliando volutamente inserimento sia la versione con un cout sia la versione con due cout non funzionano.

  8. #8
    evidentemente il compilatore borland ragiona in maniera diversa da g++ .

    ripeto, il programma è fatto ed è a posto così, non servono aggiunte o altro (in uni va compilato con g++ e quindi conosco il mio pollo), e i controlli sono a posto, nè tantomeno posso cambiarli perchè è così per consegna .

    il problema comunque non l'ho riscontrato solo io, ma diverse altre persone che mi hanno fatto da tester, tutte con g++, e con differenti versioni.

    voglio solo capire perchè c'è quel funzionamento non corretto, il programma è già testato e a posto.

  9. #9
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    contento tu

  10. #10
    Ho provato a compilare i 2 sorgenti con g++ (GCC) 4.2.1-sjlj (mingw32-2) su Windows ed ottengo lo stesso output.
    "Se riesci a passare un pomeriggio assolutamente inutile in modo assolutamente inutile, hai imparato a vivere."

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.