Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [C] Istruzione GOTO e pulizia variabile

    Ciao a tutti,

    Osservate questo semplice codice:

    codice:
    int main() {
        
        char v_scelta;
        int a;
        
        printf("     MENU''");
        printf( "\n" );
        printf (" 1 - Somma"); 
        printf( "\n" );
        printf (" 2 - Sottrazione"); 
        printf( "\n" );
        printf (" 3 - Moltiplicazione"); 
        printf( "\n" );
        printf (" 4 - Divisione"); 
        printf( "\n" );
        
    Etichetta_1:     
        scanf ("%c", &v_scelta);
        if ((v_scelta != '1') && (v_scelta != '2') && (v_scelta != '3') && (v_scelta != '4'))
            {
            printf (" ERRORE: Scelta errata!"); 
                    printf ( "\n" );
            goto Etichetta_1;
        }
        
        system ("PAUSE");
        return 0;
    }

    Lo scopo del programma è fornire all'utente un menù che gli consenta di scegliere una delle 4 operazioni aritmetiche. Ma se l'utente dovesse inserire un valore di MENU' inesistente si vuole fare in modo che il programma segnali l'errore e metta l'utente in condizione di fornire un nuovo valore in input.
    Se il codice viene eseguito il compilatore stampa a video il menù e resta in attesa dell'input dell'utente come previsto dall'istruzione SCANF.
    Se si prova a fornire in input un valore maggiore di 4. (ad esempio 6) il risultato ottenuto è questo : risultato.png

    Perchè il messaggio d'errore compare 2 volte ?
    Perchè la seconda volta che viene eseguito SCANF il compilatore non attende l'INPUT utente ?
    Anche DEBUGGANDO non sono riuscito a capire perchè SCANF non attende che venga immesso un nuovo valore. A mio parere l'ideale sarebbe resettare la variabile V_SCELTA con un istruzione di "CLEAR", ma da quanto ho capito questo in C non è possibile ! E' vero che in C non posso resettare una variabile ?

    Grazie.

  2. #2
    Il codice presentato contiene una silloge delle peggiori violazioni alle più basilari regole di engineering ed economia del sorgente inerenti il linguaggio C. L'istruzione goto è pesantissimamente deprecata, oltreché sostanzialmente inutile nel 99% del codice del real world. Anche la scanf() è deprecata, mentre l'invocazione di funzioni di sistema per l'attesa di un tasto è semplicemente una bestemmia.
    Le invocazioni multiple di printf() per la mera stampa di costanti di testo sono altamente inefficienti ed assolutamente evitabili.
    Lo stesso concetto di "reset di una variabile" è decisamente avulso dal contesto dell'informatica applicativa: al limite si può parlare di ripristino di un default, o di azzeramento di una variabile.

    Una versione banalmente scolastica e incompleta, ma certamente più accettabile, del codice in oggetto potrebbe avere la seguente forma:
    codice:
    #include <stdio.h>
    
    void kbd_clean() 
    {
        register char ch;
        while (((ch = getchar()) != '\n') && (ch != EOF)); 
    }
    
    int main(void)
    {
        char v_scelta;
        char done = 0;
            
        puts("     MENU'\n"
             " 1 - Somma\n" 
             " 2 - Sottrazione\n" 
             " 3 - Moltiplicazione\n" 
             " 4 - Divisione\n"); 
        
        while (0 == done)
        {
            scanf ("%c", &v_scelta);
            kbd_clean();
            if (NULL == strchr("1234", v_scelta))    
            {
                puts(">> ERRORE: Scelta errata o inesistente!\n"); 
            }
            else
            {
                done = 1;
            }
        }
        
        return 0;
    }
    • Un plauso a Grisha Perelman, raro esempio di genuino anticonformismo umano e scientifico.

  3. #3

    Grazie

    GRAZIE M.A.W.

    Studiano il linguaggio C attraverso un manuale in pdf trovato ON-LINE, mi sono imbattuto nell'istruzione GOTO e per testarla mi sono inventato quel piccolo esempio.

    Grazie per l'esaustiva risposta.

  4. #4
    Lascia perdere i manuali online, nel migliore dei casi sono obsoleti.
    Prendi in considerazione una seria bibliografia, invece.
    • Un plauso a Grisha Perelman, raro esempio di genuino anticonformismo umano e scientifico.

  5. #5
    Quote Originariamente inviata da M.A.W. 1968 Visualizza il messaggio
    Il codice presentato contiene una silloge delle peggiori violazioni alle più basilari regole di engineering ed economia del sorgente inerenti il linguaggio C. L'istruzione goto è pesantissimamente deprecata, oltreché sostanzialmente inutile nel 99% del codice del real world. Anche la scanf() è deprecata, mentre l'invocazione di funzioni di sistema per l'attesa di un tasto è semplicemente una bestemmia.
    Le invocazioni multiple di printf() per la mera stampa di costanti di testo sono altamente inefficienti ed assolutamente evitabili.
    Lo stesso concetto di "reset di una variabile" è decisamente avulso dal contesto dell'informatica applicativa: al limite si può parlare di ripristino di un default, o di azzeramento di una variabile.

    Una versione banalmente scolastica e incompleta, ma certamente più accettabile, del codice in oggetto potrebbe avere la seguente forma:
    codice:
        register char ch;
    Parli di violazioni ai coding-standards, deprecazioni, inefficienza ed usi register?

  6. #6
    Quote Originariamente inviata da signoredeltempo Visualizza il messaggio
    Parli di violazioni ai coding-standards, deprecazioni, inefficienza ed usi register?
    Certo che sì. E ne parlo con la più ampia cognizione di causa: sia come progettista e autore di cross-compiler, parser, librerie, (parti di) kernel e altre centinaia di migliaia di LOC in C (e Assembly) per applicazioni altamente critiche in hard realtime sviluppate in un quarto di secolo di carriera in una multinazionale, sia come formatore a livello post-lauream. Cosa che evidentemente ignori: quindi puoi risparmiarti gli inutili tentativi di sarcasmo.

    E' piuttosto palese che ciò che ti è stato insegnato non ti consente di valutare la ben diversa gravità che intercorre tra l'impiego di una scanf() e l'uso di una keyword che, nel piccolo mondo dei PC, risulta al limite superflua con tre o quattro compilatori C mainstream. Ma con 50 miliardi di device embedded in campo, e una media di sei miliardi di nuove consegne ogni anno nell'ultimo quinquennio, è ovvio che la maggioranza del codice C circolante non è destinata a sistemi mainstream, e certamente non risponde ai requisiti di "modernità" previsti dai recenti corsettini universitari.
    Ora, chiunque abbia letto almeno una frazione dei dodicimila post del sottoscritto in giro per i forum di programmazione italiani, conosce il mio stile, il mio background e sa bene che non perdo occasione per ricordare questi dati di realtà, anche con semplici suggerimenti volti a ingenerare curiosità. Anche perché, alla mia età e con la mia anzianità telematica, posso permettermi ampiamente di stare sopra le righe, quando ne ho voglia.
    Ultima modifica di M.A.W. 1968; 03-01-2015 a 22:40
    • Un plauso a Grisha Perelman, raro esempio di genuino anticonformismo umano e scientifico.

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    156
    Quote Originariamente inviata da M.A.W. 1968 Visualizza il messaggio
    Uso "register" scientemente e con grande compiacimento...
    Pure io non ho tempo per i flame, ma questa volta non riesco a non commentare e proprio perché in genere leggo i tuoi post con interesse, posso dirti che concordo pienamente con signoredeltempo.

    1. Che senso ha (dal punto di vista scolastico) usare register in un esempio in cui a mala pena si usa printf?
    2. Proprio perché hai scritto milioni di milioni di milioni di righe di codice dovresti essere in grado di confrontarti con qualcuno che ne avrà scritto 100 in tutta la sua vita.
    E qui concludo visto che penso che i miei commenti siano "altamente inefficienti ed assolutamente evitabili".

  8. #8
    Quote Originariamente inviata da zucchino Visualizza il messaggio
    E qui concludo visto che penso che i miei commenti siano "altamente inefficienti ed assolutamente evitabili".
    Appunto. Per quanto mi riguarda, il presente thread è concluso. Cerchiamo di dedicare il tempo a questioni più produttive: mettersi a sindacare su scelte stilistiche e dettagli irrilevanti in un banalissimo esempio è, in generale, una pessima idea. Se non capite cosa avevo in mente compiendo una determinata scelta, siete liberissimi di scrivere in privato - o anche nel thread, alcuni dei più letti del web italiano sono nati da OT gemmati da semplici curiosità disseminate in qualche sorgente.

    In qualsiasi caso, e sia detto ad usum delphini, anche quando non si capisce l'intenzione di chi è più preparato ed esperto di noi, rimane d'uopo assumere sempre atteggiamenti rispettosi, non saccenti, scevri da qualsivoglia tentativo di sarcasmo o comunque male interpretabili. Mancare di rispetto agli anziani del web (e di FIDOnet!) non è certo una idea luminosa: se ci stanchiamo di cercare a fatica il tempo per contribuire, gli orizzonti si restringono. Parecchio. Già la noia prevale, in questi anni di basso impero... non mi pare il caso di peggiorare ulteriormente.
    Ultima modifica di M.A.W. 1968; 03-01-2015 a 23:12
    • Un plauso a Grisha Perelman, raro esempio di genuino anticonformismo umano e scientifico.

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    156
    Mi scuso

  10. #10

    Moderazione

    Intervengo in questo teatrino per ricordare che la buona educazione è sempre richiesta, indipendentemente dal proprio livello di conoscenze o dall'atteggiamento dell'interlocutore.
    M.A.W. 1968, nessuno dubita della tua carriera e della tua conoscenza profonda di problematiche complesse e di sviluppo in ambiti critici, ma si può senz'altro reagire alle critiche in maniera più elegante rispetto al "lei non sa chi sono io".
    signoredeltempo, non è necessario fare sarcasmo per esporre le proprie considerazioni.

    La discussione termina qui, specie visto che il tema originale della discussione mi sembra sia stato affrontato compiutamente.
    Ultima modifica di MItaly; 04-01-2015 a 01:25
    Amaro C++, il gusto pieno dell'undefined behavior.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.