Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente bannato
    Registrato dal
    Apr 2009
    Messaggi
    30

    C - Semplice menu con gestione dell'eccezzione.

    Ciao a tutti, sono un pochettino in difficolta con una questione che sembra semplice ma ebbene non mi viene..

    Sto scrivendo un semplice programmino e, tralasciando il suo obbiettivo finale ho bisogno di fargli un input con getchar()..

    Il problema mi si è presentato quando volevo gestire l'eccezzione, ossia che nei casi che input != 's' o 'n' devo richiamare la funzione getchar()...

    posto il codice con la soluzione "minima" tra i commenti...

    codice:
    #include<stdio.h>
    #include<sys/stat.h>
    #include<sys/types.h>
    #include<stdlib.h>
    #include<string.h>
    
      
    int main()
    {
     char r;
     printf("\nSi desidera creare una nuova directory di prova?? [s/n] : ");
     r = getchar();
    
    /* switch(r)
     {
      case 's':
       printf("Creazione della cartella\n");
       //.....
       break;
      case 'n':
       printf("Ok, fine del programma\n");
       break;
      default:
       printf("Input non valido..\n");
      break;
     }*/
     
     if(r=='s')
      printf("Si..\n\n");
      /*code..*/
     else if(r=='n')
      printf("No..\n\n");
     else
     {
      while(r!='s'||r!='n')
      {
       printf("Input non valido..\n");
       r = getchar();
      }
     }
     
     printf("\n");
     exit(0);
     return 0;
    }
    e questo è l'output della 3 differenti situazioni..

    codice:
    Si desidera creare una nuova directory di prova?? [s/n] : s
    Si..
    
    Si desidera creare una nuova directory di prova?? [s/n] : n
    No..
    
    Si desidera creare una nuova directory di prova?? [s/n] : w
    Input non valido..
    Input non valido..
    s
    Input non valido..
    Input non valido..
    n
    Input non valido..
    Input non valido..
    s
    ....
    Qualcuno mi puo suggerire un consiglio please???? Volendo ne faccio a meno ma mi voglio togliere questa curiosita!! Una soluzione sarebbe setjmp()??
    Grazie a tutti!

  2. #2
    Utente bannato
    Registrato dal
    Apr 2009
    Messaggi
    30

    Prova con setjmp()

    Ho provato ad utilizzare setjmp..

    codice:
    #include<stdio.h>
    #include<sys/stat.h>
    #include<sys/types.h>
    #include<stdlib.h>
    #include<string.h>
    #include<setjmp.h>
    
    
    int main()
    { 
     char r;
     jmp_buf buf;
    
      printf("\nCreare una nuova cartella? [s/n]: ");
      setjmp(buf);
      scanf("%c", &r);
    
      switch(r)
      {
       case 's':
        printf("Creazione della cartella\n");
        break;
       case 'n':
        printf("Ok, fine del programma\n");
        break;
       default:
        printf("\nInput errato, ripetere.. [s/n] :");
        longjmp(buf, 2);
        break;
      }
     exit(0);
     return 0;
    }
    Con la differenza che l'output per l'eccezzione viene stampato 2 volte...

    codice:
    Creare una nuova cartella? [s/n]: a  /*input errato...*/
    /*il messaggio d'eccezzione viene visualizzato 2 volte..*/
    Input errato, ripetere.. [s/n] :
    Input errato, ripetere.. [s/n] :s        
    Creazione della cartella                 /*output corretto.*/
    Aiuto!!!!!

  3. #3

    Re: C - Semplice menu con gestione dell'eccezzione.

    Originariamente inviato da chaka
    Ciao a tutti, sono un pochettino in difficolta con una questione che sembra semplice ma ebbene non mi viene..

    Sto scrivendo un semplice programmino e, tralasciando il suo obbiettivo finale ho bisogno di fargli un input con getchar()..

    Il problema mi si è presentato quando volevo gestire l'eccezzione, ossia che nei casi che input != 's' o 'n' devo richiamare la funzione getchar()...

    posto il codice con la soluzione "minima" tra i commenti...

    [..]

    Qualcuno mi puo suggerire un consiglio please???? Volendo ne faccio a meno ma mi voglio togliere questa curiosita!! Una soluzione sarebbe setjmp()??
    Grazie a tutti!
    eccezione con una Z!
    a parte l'indentazione del codice e il fatto di usare una catena if-else al posto del case (che è là apposta e ti eviterebbe questi problemi), qua c'è un problema logico.
    in
    codice:
    (r!='s'||r!='n')
    la condizione è sempre vera.
    o la metti come while (!(r=='s')||(r=='n')) (come probabilmente l'avevi pensata), oppure molto semplicemente while ((r!='s')&&(r!='n')).


    per il secondo, guardati bene come funzionano setjmp e longjmp, comunque andava postato nel forum di programmazione
    flickr
    i solitoni sono il futuro!

  4. #4
    Utente bannato
    Registrato dal
    Apr 2009
    Messaggi
    30
    è sempre la stessa storia gia ho provato....

    L'output 'e ripetuto 2 volte...

    Poi che problemi ci sono con l'indentazione...

    Ah guarda il 2ndo codice che ho postato piuttosto..


    qua c'è un problema logico.
    in
    codice:

    (r!='s'||r!='n')


    la condizione è sempre vera.
    L'eccezzione si deve verificare appunto in quell'occasione..

    Azz

  5. #5
    io non programmo in c, eppure in 5 minuti si capisce come funzionano longjmp e setjmp, ed è ben specificato ovunque che setjmp ha 2 ritorni (esempio, http://docs.sun.com/app/docs/doc/816...gjmp-3c?a=view ):
    At the time of the second return from setjmp(), all external and static variables have values as of the time longjmp() is called (see EXAMPLES).
    quindi un modo semplice per evitarti questo problema, è distinguere il caso del primo ritorno di setjmp (che è per forza = 0) con il caso di un altro ritorno di setjmp (che non può essere = 0); non è solo un modo per evitare un problema ma è anche il corretto modo di operare, così effettivamente ti fai qualcosa dei codici di eccezione che sollevi con il secondo argomento di longjmp .

    ad esempio:

    codice:
    #include<stdio.h>
    #include<sys/stat.h>
    #include<sys/types.h>
    #include<stdlib.h>
    #include<string.h>
    #include<setjmp.h>
    
    
    int main()
    { 
     char r,i;
     int res = 0;
     jmp_buf buf;
    
      printf("\nCreare una nuova cartella? [s/n]: ");
      res = setjmp(buf);
    
      if(res!=0)
         //siamo nella seconda chiamata. facciamo un flush del carattere precedente.
         getchar();
    
      r = getchar();
      switch(r)
      {
       case 's':
        printf("Creazione della cartella\n");
        break;
       case 'n':
        printf("Ok, fine del programma\n");
        break;
       default:
        printf("\nInput errato, ripetere.. [s/n] :");
        longjmp(buf, 2);
      }
     exit(0);
     return 0;
    }
    flickr
    i solitoni sono il futuro!

  6. #6
    Utente bannato
    Registrato dal
    Apr 2009
    Messaggi
    30

    GRANDE!!

    GRAZIE GRAZIE GRAZIE!!!

    Mi hai fatto capire una cosa molto importante!! ero giusto alla prima implementazione di setjmp...

    Benissimo!! Ero sulla buona strada quindi, ti ringrazio moltissimo..

    A parte la Z anche io non avevo tutti i torti.. ahah

    Grande ti ringrazio!! Tra l'altro proprio non la conoscevo questa doc di java...

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.