Newsgroup: it.comp.lang.c
Titolo: Qual'e' il problema?!?!

Ecco una cosa veramente strana: ho provato questo semplicissimo programma su
due compilatori diversi (gcc sotto Linux e Borland C++ 5.02) ed ambedue danno
lo stesso problema: il printf() finale fornisce dei valori "approssimativi"
(tipo -252 anziche' 0, 5776 invece di 6000, et cetera); ma PERCHE'?!?!?
Ma il bello e' che sotto il Borland aggiungendo alcuni printf() qua e la'
(vedere il codice) il programma funziona bene!
Ci sono due possibilita':
1 - C'e' un errore cosi' stupido che non lo vedrei neanche se ce l'avessi
davanti;
2 - Le assegnazioni incluse in un if ... else statement creano problemi a piu'
di un compilatore (infatti avevo notato un comportamento simile anche in un
altro programma, che riscritto in modo diverso ha poi funzionato bene).
Qualcuno puo' darmi una mano?
Alceste
P.S.: Scusate per i nomi delle variabili (il programma non e' mio, ma e' stato
scritto da una mia amica) e per l'indentazione (questa pero' e' colpa mia, che
non riesco a far leggere i file al composer di Netscape se non con un grab da
una finestra all'altra).
---------------------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
/* Il for... che c'e' qui sotto serve a ripulire il buffer di tastiera in un
modo (credo) portabile */
#define wait for(; getchar() != '\n';); getchar()
int main(void)
{
 char b = 'r';    /* Conterra' l'input dell'utente */
 int i,
 y, /* Conterra' il numero random uscito dalla roulette */
 s, /* Puntata dell'utente */
  value;     /* Verra' usato come flag per verificare la vincita o la perdita
*/
 int sum2 = 0;      /* La variabile incriminata, che verra' stampata con valori
"strani" */
 char answer = 'y';
static int nero[] =
 {19, 32, 12, 3, 7, 18, 9, 14, 1, 16, 5, 23, 30, 36, 27, 34, 25, 21};
 static int rosso[] =
 {13, 11, 8, 10, 24, 33, 20, 31, 22, 29, 28, 35, 26, 15, 4, 2, 17, 6};
 int *c;
 srand((unsigned) time(NULL));
 printf("\t\t\t\t***BLACK OR RED***\n\n");
 do {
  value = 0;
  printf("How much do you want to play?\n:L. ");
  scanf("%d", &s);
  for (; getchar() != '\n';);
  printf("\nRED OR BLACK?(r/b)\n: ");
  scanf("%1s", &b);
  c = (b != 'r') ? nero : rosso;
  y = (int) (37 * (float)rand() / RAND_MAX + 1);
  if (y != 37)
   printf("\n%d\n\n", y);
  else
   printf("\n00\n\n");
  for (i = 0; i < 17; ++i)
   if (y == c[i])
    value = 1;
  wait;
  if (value) {
   printf("You won L.%d!Do you want to play again?(y/n)\n", s * 2);
   scanf("%1s", &answer);
   sum2 += (s * 2);
   printf("Valore attuale: %d\n", sum2);  /* Questo printf() fa si' che il
programma funzioni bene sul Borland C++ */
  } else {
   printf("Sorry,you lose.Try again!(y/n)\n");
   scanf("%1s", &answer);
   sum2 -= s;
   printf("Valore attuale: %d\n", sum2);  /* Questo printf() fa si' che il
programma funzioni bene sul Borland C++ */
  }
 }
 while (answer != 'n');
 printf("Your score in \"BLACK OR RED\" is L.%d!\n", sum2); /*
PERCHE' FUNZIONA MALE?!?!?!?!? */
 wait;
 return 0;
}

    sum2 += (s * 2);
Hai utilizzato s sia per la puntata che per la risposta.
EMG

Enrico Maria Giordano wrote:

?!?!?!
Ma ne sei proprio sicuro? ;-)
Quel "%1s" del printf() e' una sequenza di controllo che richiede la lettura di
una stringa di lunghezza 1, che poi verra' memorizzata in una variabile char
(&answer). In effetti non e' proprio il massimo dell'eleganza, ma certo non
dovrebbe dare problemi...
STOP!!!! Forse ho trovato la risposta al mio problema: quel "%1s" andra' a
memorizzare una stringa di 1 carattere PIU' IL CARATTERE NULL, che  sovrascrivera'
la locazione di memoria successiva, incasinando cosi' il contenuto di s... Ho
ragione? Se e' cosi', forse usando un "%c" le cose torneranno a posto...
In effetti, almeno sul gcc il programma con questa modifica sembra funzionare
bene...
Insomma Enrico, anche se la tua risposta non era proprio corretta, mi ha fatto
notare proprio il punto di programma bacato...
GRAZIEEEE!!!!!!
Alceste
P.S.: tra l'altro, mi accorgo di come la risposta al mio problema fosse la n.1 del
mio post originale: un errore cosi' stupido che non lo vedrei neanche se ce
l'avessi davanti...

ragione? Se e' cosi', forse usando un "%c" le cose torneranno a posto...
E se utilizzassimo un bel getchar() ? ;)

 Ma ne sei proprio sicuro? ;-)
Questo succede quando uno risponde ai messaggi a notte fonda...
Scusami.
EMG

 E se utilizzassimo un bel getchar() ? ;)
Of course... Come avevo scritto, il programma non e' mio, e piu' che
correggere i dettagli mi era stato chiesto di dare dei consigli sulla
struttura...
Questo spiega come mai mi sia sfuggita una cosa cosi' macroscopica come un
printf() "omicida".
La prossima volta staro' piu' attento...
Alceste
---------------------------------------------------------------------------

 Scusami.
Figurati...
Grazie cmq per l'interessamento!
Alceste
-- 
---------------------------------------------------------------------------