Newsgroup: it.comp.lang.c
Titolo: [NEWBIE] Programma sbagliato,consigli

Ciao a tutti,
sto affrontando da poco il C, ed ho davanti un problema per me
semplice ma che ,essendo la mia insicurezza ancora alta, non vorrei
affrontare con "leggerezza", il codice oltre all'errore appositamente
introdotto nella procedura foo() e' progettualmente sbagliato,
perche'? Io ho pensato perche' la chiamata di procedura foo() va messa
dopo la chiamata di procedura esegui() altrimenti si ha per prima
l'esecuzione della procedura foo() con conseguente modifica di
"scelta" che non permette mai l'esecuzione dello switch nella
procedura esegui()... e' giusto? Grazie mille a tutti!
#include <stdio.h>
#include <stdlib.h>
void esegui();
void foo();
int scelta=0;
void main() {
printf("\n inserisci un valore tra da 1 a 3: ");
scanf("%d", &scelta);
foo();
esegui();
printf("\n l'opzione scelta e': %d", scelta);
system("PAUSE");
}
void foo() {
scelta=scelta+3;   //modifica "scelta" per "errore"...
}
void esegui() {
switch(scelta) {
  case 1: printf("\n *"); break;
  case 2: printf("\n **"); break;
  case 3: printf("\n ***"); break;
  default: printf("\n valore errato"); break;
  }
}

 perche'?
  <cut>
perché quando viene invocata 'esegui', la variabile 'scelta' è sempre
maggiore di 3 e quindi ogni volta stampi "\n valore errato".
Ma a parte questa banalità, ti consiglierei di riflettere sul pessimo
stile del tuo programma, in cui fai uso di:
- variabili globali (senza una precisa ragione, quindi evitabili)
- side effects (senza una precisa ragione, quindi evitabili)
- codice non portabile ( system("PAUSE") )
Cerca inoltre di essere più aderente alla programmazione strutturata e
utilizzare in'indentazione più decente.
-- 
Ciao,
    Giuseppe

 procedura esegui()... e' giusto?
E' sbagliata la parte " non permette mai l'esecuzione" e te ne accorgi
compilando ed
eseguendo il codice  che hai postato che descrive proprio quella
situazione..
[la foo() prima della esegui() ], lo switch e' sempre eseguito perche' si
trova in una funzione
che prima o poi chiami ugualmente,non c'e' nulla che impedisca la sua
esecuzione,
la foo() modifica solo il valore di scelta.
Questo per dire di osservare bene l'output del programma  perche' aiuta (ti
saresti accorto
che entri nello switch).
Ciao!

 procedura esegui()... e' giusto?
Esatto,  incrementare di  3  /scelta/ fa  visualizzare  il messaggio  di
errore in tutti i  casi, a meno che l'utente non  inserica 0. Ma tu dici
che l'errore  introdotto e` voluto,  il che  mi fa pensare  che l'errore
progettuale sia nell'uso di una variabile globale.
Dico  questo  perche`,  IMHO,  foo()   fa  vedere  come  sia  pericoloso
utilizzare   variabili  che   possono  essere   modificate  all'insaputa
dell'utente. A meno di non leggere il codice nella sua interezza (ok, in
questo caso  e` semplice, sono  poche righe...  ma pensa ad  un progetto
piu` grosso)  non e`  affatto banale capire  chi ha  modificato /scelta/
(leggi: una qualunque variabile globale) e perche`.
L'errore formale sta nella dichiarazione di main. Il C standard prevede
che main possa avere questi due prototipi (e non altro):
int main(void);
int main(int argc, char **argv);
Detto questo il programma lo scriverei cosi`:
#include <stdio.h>
#include <stdlib.h>
void esegui(int);
void foo();
int main(void) {
        int scelta;
 
        printf("\n inserisci un valore tra da 1 a 3: ");
        scanf("%d", &scelta);
 
        foo();
 
        esegui(scelta);
 
        printf("\n l'opzione scelta e': %d", scelta);
        system("PAUSE");
}
/* scelta non e` piu` una variabile locale, questa funzione non puo`
 * piu` alterarla!
 */
void foo() {
        /* scelta=scelta+3; */
}
void esegui(int scelta) {
        switch(scelta) {
                case 1: printf("\n *"); break;
                case 2: printf("\n **"); break;
                case 3: printf("\n ***"); break;
                default: printf("\n valore errato"); break;
        }
}
Nota come un indentazione corretta aiuta a leggere il codice e capire il
flusso di esecuzione.
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
Non ho ancora capito se il mio cane e` maschio o femmina:
quando fa la pipi` si chiude in bagno

utilizzare in'indentazione più decente.
E' stata colpa del copia ed incolla :/
Grazie mille dei preziosi consigli.

Grazie a tutti non so' proprio come sdebitarmi... c'e' sempre qualcosa
da imparare :)