Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - [C]-Verifica validita' input da tastiera
Forum - C/C++ - [C]-Verifica validita' input da tastiera - Pagina 3

Pagine: [ 1 2 3 ] Precedente | Prossimo
Avatar
Mikelius (Member)
Expert


Messaggi: 525
Iscritto: 14/04/2017

Segnala al moderatore
Postato alle 1:37
Venerdì, 14/07/2017
Testo quotato

Postato originariamente da lumo:

È un problema del C che non permette di ritornare più valori contemporaneamente.
Dove ha senso si usa una struttura allocata dinamicamente e si ritorna quella, altrimenti si aggiungono degli argomenti alla funzione per poter salvare più risultati. Ovviamente devono essere puntatori e vanno dereferenziati, quindi c'è in più il rischio che per sbaglio venga passato NULL.
In aggiunta questo di solito si ritorna anche qualcosa tipo un bool o una enum che indica il successo dell'operazione.



Conoscevo queste problematiche.
Tempo fa mi ero creato funzioni che avevano come parametri anche gli output e come return un enum che in base al numero indicasse se c'era un errore e il tipo di errore.
(-1 input=NULL ; 0 Tutto ok; 1 Funzione fallita)
La domanda era più per un fatto stilistico/buona programmazione (a parità di possibilità d'uso)

tra le due forme, quale si prediligge?

MYRETURN func(In,Output)

o
output func(In)

Io a pelle preferirei la 1°, in questo modo con un semplice if(func) posso testarne l'esito
e non devo ricordarmi tutti i possibili valori d'uscita. Ma vedo che le funzioni dello stardard prediliggono tutte la 2° forma in generale








PM Quote
Avatar
lumo (Member)
Expert


Messaggi: 449
Iscritto: 18/04/2010

Segnala al moderatore
Postato alle 21:18
Venerdì, 14/07/2017
Non c'è una regola, dipende dalla funzione. Nel caso vadano bene entrambe le soluzioni fai come meglio credi, l'importante è essere consistenti.

PM Quote
Avatar
soury (Member)
Newbie


Messaggi: 7
Iscritto: 09/12/2015

Segnala al moderatore
Postato alle 16:36
Martedì, 18/07/2017
Ciao intanto dico subito che non ho letto tutto quindi non se la mia risposta sia attinente alla domanda o se hai gia trovato la risposta; fatta la premessa ti direi: se devi verificare l'input carattere per carattere perché non usare direttamente un keyevent? cosi ti risparmi molto lavoro, ad ogni tasto che viene premuto controlli se sia valido o meno, cosi poi anche decidere di non permettere all'user di inserire certi carattere.

è sono fuori allenamento con c++ quindi non ti garantisco che il codice che ti scrivero in seguito funzioni perfettamente ora non riesco a provarla:

Codice sorgente - presumibilmente C++

  1. char GetInput()
  2. {
  3. HANDLE input=GetStdHandle(STD_INPUT_HANDLE) ;
  4. LPDWORD length ;
  5. INPUT_RECORD record ;
  6. char ToReturn ;
  7.      while (record.Event.KeyEvent.bKeyDown)
  8.     {
  9.    ReadConsoleInput(input,&record,1,length) ;
  10.    ToReturn= record.Event.KeyEvent.uChar.AsciiChar ;
  11.  
  12.    }
  13. return ToReturn ;
  14. }
  15.  
  16. //now whenever testing the function:
  17.  
  18. int main()
  19. {
  20.  
  21.   if (GetInput()=='il tuo carattere')
  22.     cout<<"Sono un mostro ahahahahaha LOL";
  23.   else cout<<"Riprova sarai piu fortunato :pat:" ;
  24.   cin.get();
  25.   return 0 ;
  26. }



NB:"ricorda settare le variabili e le cazzate che ho scritto :asd:"

Ultima modifica effettuata da lumo il 18/07/2017 alle 17:00
PM Quote
Avatar
Mikelius (Member)
Expert


Messaggi: 525
Iscritto: 14/04/2017

Segnala al moderatore
Postato alle 18:52
Martedì, 18/07/2017
Testo quotato

Postato originariamente da soury:

Ciao intanto dico subito che non ho letto tutto quindi non se la mia risposta sia attinente alla domanda o se hai gia trovato la risposta; fatta la premessa ti direi: se devi verificare l'input carattere per carattere perché non usare direttamente un keyevent? cosi ti risparmi molto lavoro, ad ogni tasto che viene premuto controlli se sia valido o meno, cosi poi anche decidere di non permettere all'user di inserire certi carattere.

è sono fuori allenamento con c++ quindi non ti garantisco che il codice che ti scrivero in seguito funzioni perfettamente ora non riesco a provarla:

Codice sorgente - presumibilmente C++

  1. char GetInput()
  2. {
  3. HANDLE input=GetStdHandle(STD_INPUT_HANDLE) ;
  4. LPDWORD length ;
  5. INPUT_RECORD record ;
  6. char ToReturn ;
  7.      while (record.Event.KeyEvent.bKeyDown)
  8.     {
  9.    ReadConsoleInput(input,&record,1,length) ;
  10.    ToReturn= record.Event.KeyEvent.uChar.AsciiChar ;
  11.  
  12.    }
  13. return ToReturn ;
  14. }
  15.  
  16. //now whenever testing the function:
  17.  
  18. int main()
  19. {
  20.  
  21.   if (GetInput()=='il tuo carattere')
  22.     cout<<"Sono un mostro ahahahahaha LOL";
  23.   else cout<<"Riprova sarai piu fortunato :pat:" ;
  24.   cin.get();
  25.   return 0 ;
  26. }



NB:"ricorda settare le variabili e le cazzate che ho scritto :asd:"




Testo quotato

Postato originariamente da soury:

Ciao intanto dico subito che non ho letto tutto quindi non se la mia risposta sia attinente alla domanda o se hai gia trovato la risposta; fatta la premessa ti direi: se devi verificare l'input carattere per carattere perché non usare direttamente un keyevent? cosi ti risparmi molto lavoro, ad ogni tasto che viene premuto controlli se sia valido o meno, cosi poi anche decidere di non permettere all'user di inserire certi carattere.

è sono fuori allenamento con c++ quindi non ti garantisco che il codice che ti scrivero in seguito funzioni perfettamente ora non riesco a provarla:

Codice sorgente - presumibilmente C++

  1. char GetInput()
  2. {
  3. HANDLE input=GetStdHandle(STD_INPUT_HANDLE) ;
  4. LPDWORD length ;
  5. INPUT_RECORD record ;
  6. char ToReturn ;
  7.      while (record.Event.KeyEvent.bKeyDown)
  8.     {
  9.    ReadConsoleInput(input,&record,1,length) ;
  10.    ToReturn= record.Event.KeyEvent.uChar.AsciiChar ;
  11.  
  12.    }
  13. return ToReturn ;
  14. }
  15.  
  16. //now whenever testing the function:
  17.  
  18. int main()
  19. {
  20.  
  21.   if (GetInput()=='il tuo carattere')
  22.     cout<<"Sono un mostro ahahahahaha LOL";
  23.   else cout<<"Riprova sarai piu fortunato :pat:" ;
  24.   cin.get();
  25.   return 0 ;
  26. }



NB:"ricorda settare le variabili e le cazzate che ho scritto :asd:"



Come prima cosa: grazie dell'intervento.

Il mio scopo non è verificare carattere per carattere. Ma piuttosto, verificare che l'input sia corretto, ad esempio voglio una lettera tra S e N, o un intero tra 0 e 1 Per farlo ho scelto di verificare carattere per carattere e non l'insieme dell'input. Comunque la soluzione era per il C e non C++

PM Quote
Avatar
soury (Member)
Newbie


Messaggi: 7
Iscritto: 09/12/2015

Segnala al moderatore
Postato alle 8:53
Mercoledì, 19/07/2017
Mmmm allora nella tua funzione potresti usare il "compar" ti risparmia molto codice:asd:

PM Quote
Pagine: [ 1 2 3 ] Precedente | Prossimo