Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Dopo aver visto il codice di AldoBaldo nel post: " Menu rapido con quantita' di voci variabile" e come ha gestito l'input, mi è venuto in mente che ho pubblicato in altro forum una mia funzione da principiante per gestire l'input numerico da tastiera in C che non mostra i caratteri vietati.
La funzione può essere impostata per accettare un numero di cifre massimo definito, anche il valore accettato immesso può essere impostato a solo positivo, o positivo e negativo. Supportato il BackSpace e il taso Esc.
Il codice che ho realizzato mi suscita varie domande:
1) La funzione getch(), non è standard C?, è sbagliato usarla?, come si sostituisce?
2) Per avanzare con l'immissione del prossimo carattere ho usato un goto, per toglierlo devrei mettere un do while, e un if, ma è proprio così brutto il goto?
3) il controllo del sistema operativo Linux/Win funzionerà?
4) Senza stravolgerlo, cosa si può migliorare?
Codice sorgente - presumibilmente C++
#include <stdio.h>
#include <stdlib.h>
// scelta libreria per getch(), non testato su Linux
Sai bene che il mio livello di competenza è amatoriale, per cui potrei buttar lì delle inesattezze. Detto questo...
Per quel che ne so e se ho ben capito, getch() non è incluso nello standard, ed ha la particolarità di fornire un carattere immesso da tastiera PRIMA che venga inserito nel buffer di stdin. Per questo permette di analizzare i caratteri BATTUTI alla tastiera e di prendere le volute decisioni PRIMA che il carattere venga acquisito dai meccanismi della console.
Secondo me non è sbagliato usare getch(), semplicemente si tratta di una soluzione che richiede di appoggiarsi a supporti che non è detto che siano disponibili in ogni ambiente di sviluppo. E' senz'altro un meccanismo molto pratico in una quantità di situazioni, e mi stupisco che non si sia ancora provveduto ad inserire qualcosa del genere nello standard "ufficiale".
Il goto io lo uso ogni volta che la situazione mi fa pensare ne valga la pena. In definitiva è un'istruzione come un'altra. Magari chi ne sa di più può fornire qualche spiegazione esoterica sui motivi per i quali invece non è così, ma io sono ignaro di quel tipo di motivazioni, e il goto lo uso. Di rado, ma lo uso.
In merito all'efficacia delle direttive del preprocessore penso che si debba fare riferimento ai file di intestazione di un'implementazione della libreria standard per Linux, e vedere se è effettivamente definito __unix__.
Se ho scritto delle belinate, spero che intervenga nessuno (o altri che se ne intendono) e mi corregga, così imparo qualcosa.
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
Grazie, si + o - è quello che avevo letto, chissà se nessuno ci da ulteriori info.
Il goto, anche se non mi dispiaceva, l'ho eliminato, ho usato switch, ora il codice sembra più leggibile e sorpresa... se nel case metto un range:
case '0' ... '9':
gcc lo compila ma mi dice che non è standard, l'ho sostituito con un if:
Codice sorgente - presumibilmente C++
#include <stdio.h>
#include <stdlib.h>
// scelta libreria per getch(), non testato su Linux
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
Il goto io lo uso ogni volta che la situazione mi fa pensare ne valga la pena. In definitiva è un'istruzione come un'altra. Magari chi ne sa di più può fornire qualche spiegazione esoterica sui motivi per i quali invece non è così, ma io sono ignaro di quel tipo di motivazioni, e il goto lo uso. Di rado, ma lo uso.
Non me ne intendo ma evitare il goto non ha spiegazioni esoteriche. E' un'istruzione residuata della programmazione "spaghetti" che va contro i principi della programmazione strutturata (per non parlare di quella ad oggetti).
In definitiva non va usata perché, in poche parole, rende non manutenibile il codice (ma parliamo di codici di migliaia e migliaia di righe e manutenzione fatta su altrui progetti). Vorrei vederti cercare un errore in un codice pieno di goto che saltano a destra e sinistra ... Purtroppo chi non ha esperienza non può parlare a ragion veduta.
E' comunque VERO che esiste una (non sopita) diatriba sull'uso MODERATO del goto in situazioni più uniche che rare che, essendo appunto rare, devono essere individuate con certezza e criterio da programmatori molto abili ed esperti.
In tutti i casi, tutto quello che puoi fare con i goto lo puoi fare senza, apparentemente in maniera più "difficile" o "contorta" ma più gestibile nel tempo da parte di più programmatori.
P.S. Con il tempo si affina il codice che si scrive e ci si rende conto delle tante cose che prima si facevano (male) e ci si meraviglia del perché si facessero. E' normale per tutti i programmatori ...
Ad esempio, una scrittura del tipo
Codice sorgente - presumibilmente C/C++
if(...)
{
return ...
}
else
{
... altro codice ...
}
... ancora altro codice ...
non è affatto chiara e va sostituita con
Codice sorgente - presumibilmente C/C++
if(...) return ...
... altro codice ...
... ancora altro codice ...
Ultima modifica effettuata da nessuno il 21/12/2020 alle 17:24
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
Anche a me era venuta in mente la possibilità di ricorrere allo switch, però mi sembrava troppo pedantesco farlo notare, quindi ho evitato.
Se vuoi usare switch per identificare i caratteri numerici, una soluzione c'è:
Avevo trovato la soluzuione a cascata di case, mi era piaciuto di più l'if, visto che il range è solo uno, invece la soluzione a cascata di case, è adottabile anche per diversi range, è da tenere presente per altre occasioni, grazie.
Testo quotato
Postato originariamente da nessuno: GOTO:
E' un'istruzione residuata della programmazione "spaghetti" che va contro i principi della programmazione strutturata (per non parlare di quella ad oggetti).
In definitiva non va usata perché, in poche parole, rende non manutenibile il codice (ma parliamo di codici di migliaia e migliaia di righe e manutenzione fatta su altrui progetti). Vorrei vederti cercare un errore in un codice pieno di goto che saltano a destra e sinistra ... Purtroppo chi non ha esperienza non può parlare a ragion veduta.
La voglia è quella di scrivere codice che rispetti il più possibile un'orientamento professionale, anche se i miei piccoli progetti sono destinati a nessun cliente, li vorrei comunque sempre "puliti".
Per il goto, visto che il C, è più vicino alla "macchina" e che l'assembly è pieno di salti jmp e tutti i jxx condizionali mi sono lasciato fuorviare, cercherò di non farlo più.
Testo quotato
Postato originariamente da nessuno: P.S. Con il tempo si affina il codice che si scrive e ci si rende conto delle tante cose che prima si facevano (male) e ci si meraviglia del perché si facessero. E' normale per tutti i programmatori ...
Ad esempio, una scrittura del tipo
Codice sorgente - presumibilmente C/C++
if(...)
{
return ...
}
else
{
... altro codice ...
}
... ancora altro codice ...
non è affatto chiara e va sostituita con
Codice sorgente - presumibilmente C/C++
if(...) return ...
... altro codice ...
... ancora altro codice ...
Qui sopra hai esposto un concetto, che con le info postate non ho capito, lo puoi spiegare con qualche dettaglio in più?
Non mi sembra che il codice sopra possa essere sostituito da quello sotto...
Ultima modifica effettuata da Carlo il 21/12/2020 alle 19:34
In effetti sì, perché se si verifica la condizione if la funzione ritorna e quel che segue non viene eseguito in ogni caso. Se invece la condizione if non si verifica, quel che c'è nel blocco else viene eseguito comunque (con o senza l'else stesso) come pure quel che segue.
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
In effetti sì, perché se si verifica la condizione if la funzione ritorna e quel che segue non viene eseguito in ogni caso. Se invece la condizione if non si verifica, quel che c'è nel blocco else viene eseguito comunque (con o senza l'else stesso) come pure quel che segue.
Giusto, c'è return..., credo di operare già così, forse non alla prima stesura, ma in fase di revisione a meno di una svista, il secondo codice è quello che perseguo.
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.