Newsgroup: it.comp.lang.c
Titolo: errori

ciao a tutti, ho un problema con questo codice...ogni volta che lo 
compilo mi da errori vari, ma nn riesco proprio a capirne il motivo..
ecco il codice..
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define NDEALS    3000;
#define NPLAYERS  6;
typedef enum {clubs, diamonds, hearts, spades}   cdhs;
struct card{
    int pips;
    cdhs suit;
};
typedef struct card   card;
card assign_values(int pips, cdhs suit);  /*ok*/
void prn_card_values(card *c_ptr);   /*ok*/
void play_poker(card deck[52]);     /*ok*/
void shuffle(card deck[52]);    /*ok*/
void swap(card *p, card *q);    /*ok*/
void deal_the_cards(card *deck, card (*hand)[5]);  /*ok*/
int is_flush(card h[5]);  /*ok*/
int main(void)
{
    cdhs suit;
    int i, pips;
    card deck[52];
    for(i=0; i<52; i++)
    {
       pips = i%13+1;
       if (i<13)
       suit = clubs;
       else if (i<26)
       suit = diamonds;
       else if (i<39)
       suit = hearts;
       else
       suit = spades;
      deck[i] = assign_values(pips, suit);
}
      for(i=26; i<39; i++)
          prn_card_values(&deck[i]);
      play_poker(deck);
      system("PAUSE");
}
card assign_values(int pips, cdhs suit)
{
    card c;
    c.pips = pips;
    c.suit = suit;
    return c;
}
void prn_card_values(card *c_ptr)
{
    int pips = c_ptr -> pips;
    cdhs suit = c_ptr -> suit;
    char *suit_name;
            if (suit == clubs)
              suit_name = "clubs";
            else if (suit == diamonds)
              suit_name = "diamonds";
            else if (suit == hearts)
              suit_name = "hearts";
            else if (suit == spades)
              suit_name = "spades";
            printf("card: %2d of %s\n", pips, suit_name);
}
void play_poker(card deck[52])
{
    int flush_cnt = 0, hand_cnt = 0;
    int i, j;
    card hand[NPLAYERS][5];
    srand(time(NULL));
       for (i = 0; i < NDEALS; i++)
       {
           shuffle(deck);
           deal_the_card(deck, hand);
           for (j=0;j< NPLAYERS; j++)
           {
               ++hand_cnt;
               if (is_flush(hend[j]));
               {
                   ++flush_cnt;
                   printf("%s%d\n%s%d\n%s%f\n\n", "  Hand number:    ",
                                                  "  Flush number:   ", 
flush_cnt,
                                                  "Flush probability:",
                                                  (double) flush_cnt / 
hand_cnt);
           }
       }
    }
}
void shuffle(card deck[52])
{
    int i, j;
    for ( i=0; i<52; i++)
    {
        j = rand() %52;
        swap(&deck[i], &deck[j]);
    }
}
void swap(card *p, card *q)
{
    card  tmp;
    tmp = *p;
    *p = *q;
    *q = tmp;
}
void deal_the_cars(card deck[52], card hand[NPLAYERS][5])
{
    int card_cnt = 0, i, j;
    for(j=0; j<5; j++)
    for (i =0; i<5;i++)
    hand[i][j] = deck[card_cnt++];
}
int is_flush(card h[5])
{
    int i;
    for (i=1; i<5; ++i)
    if (h[i].suit != h[0].suit)
    return o;
    return 1;
}
vi ringrazio in anticipo per la pazienza e l'aiuto
-- 
Renato Zero
Provaci a riemergere, da quei sogni che il tuo silenzio ha ucciso...che 
ne sai, dell'origine, delle lacrime, se non ha mai pianto...provaci, a 
scommettere, che al traguardo tu non sarai secondo...agile è 
quest'anima,  non puoi vincerla, non la puoi ingannare più......PROVA A 
PRENDERMI......

 #define NPLAYERS  6;
la define non termina con il ;
siccome hai messo il punto e virgola quello va a finire delle 
definizione  di NDEALS e NPLAYERS. Quindi poi quando scrivi qualcosa come
 >    card hand[NPLAYERS][5];
in realta' il compilatore vede:
card hand[6;][5];
ed e' chiaro che quel ; dopo il 6 non gli piace.
ciao,
g.

hai ragione...l'ho riletto 50 volte ma nn mi sono mai accorto del ;
cmq l'ho eseguito  ma ad un certo punto si blocca e  mi compare la 
finestra di errore....potresti aiutarmi anche in questo??
ciao e grazie


 ciao e grazie
L'hai eseguito o hai provato a compilarlo ?
No, perche' ci sono almeno altri tre errori nel codice che
hai postato :
un "hend" al posto di un "hand" e
un "return o;"  probabilmente al posto di un "return 0;"
Questi errori sono evidentissimi perche' il compilatore sicuramente
ti manda un messaggio con scritto che le variabili
hend (nella riga tal dei tali) ed
o (nella riga tal dei talaltri)
non sono definite.
Dopo di che il linker ti informa sicuramente del fatto che
non riesce a trovare la routine deal_the_card().
Questo perche' nel codice l'hai chiamata  deal_the_cars(), 
deal_the_card() e anche deal_the_cards() ! Bisogna che scegli
un nome e ti ci attieni.
Se poi chiedi (cosa buona e giusta) al compilatore di
mostrarti tutti i warning, probabilmente ti accorgi
che hai dimenticato il return 0; in fondo al main() e
cosa ancora piu' grave, hai cannato la print
                   printf("%s%d\n%s%d\n%s%f\n\n", "  Hand number:    ",
                                                  "  Flush number:   ",
                                                  flush_cnt,
                                                  "Flush probability:",
                                                  (double) flush_cnt / 
hand_cnt);
prima di tutto non vedo che senso abbia mettere il %s per scrivere
una stringa costante: puoi inserirla direttamente nella printf.
Come ad esempio:
printf("Ciao pippo %d\n",x); invece di
printf("%s%d\n","Ciao pippo ",x);
comunque quello non e' un errore.
L'errore (grave) e' che hai sbagliato l'ordine dei formati:
nella sequenza della print c'e' una stringa, un int , una stringa,
un int, una stringa, un double. E nella lista dei parametri ti
sei dimenticato almeno un int (probabilmente hand_cnt).
Quindi sono disallineati con conseguente
possibile stampa di valori assurdi o anche di crash.
La morale e' quella ti attivare sempre la stampa di tutti i warning
almeno nelle prime compilazioni.
Capisco che l'errore compreso nella #define poteva sfuggire,
ma i messaggi relativi a variabili non dichiarate sono molto
espliciti. Se quello e' il tuo problema bisogna che ti
impratichisci un po' di piu' del tuo compilatore. Altrimenti
ad ogni errore di battitura che fai ti tocca mandare un messaggio al
newsgroup...
ciao,
g.

 ciao e grazie
In un impeto di pieta' ci ho dato una altra occhiata.
(comunque non ti ci abituare...)
Hai commesso altri 2 errori rocamboleschi che contribuiscono
a dare risultati errati in fase di esecuzione.
Il primo e' questo:
if (is_flush(hand[j]));
{
   blah blah blah
}
quel ; in fondo all'if fa si che lui esegua l'istruzione nulla (;)
se l'if e' vero.
La roba sequente fra parentesi graffe viene poi eseguita SEMPRE.
Altro errore:
definisci NPLAYER come 6, ma poi quando distribusci
le carte le distribuisci non a NPLAYER giocatori, ma a 5 giocatori.
ciao,
g.

Avevo già corretto tutti gli errori che mi hai scritto....l'unico che 
nn riuscivo e "vedere" era il ; nell' if...
cmq ti ringrazio della pazienza...
