PDA

View Full Version : [C]Errore su un programma per distribuire le carte


Composition86
28-08-2008, 17:50
Salve a tutti, ho un problema con questo programma:
//Distributore di carte per il gioco del poker
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void mescolaCarte(int [][13]);//Non è necessario specificare il numero di righe
void distribuisciCarte(const int[][13], const char *[], const char *[]);
//le variabili di tipo const non sono modificalbili
main()
{
char *seme[4] = {"Cuori", "Quadri", "Fiori", "Picche"};
char *valore[13] = {"Asso", "Due", "Tre", "Quattro", "Cinque", "Sei", "Sette",
"Otto", "Nove", "Dieci", "Fante", "Regina", "Re"};
int mazzo[4][13] = {0};

srand(time(NULL));

mescolaCarte(mazzo);
distribuisciCarte(mazzo, valore, seme);

system("pause");
return 0;
}

void mescolaCarte(int deck[][13])
{
int carta, riga, colonna;

for (carta = 1 ; carta <= 52 ; carta++) {
riga = rand() % 4; //= 0, 1, 2, 3.
colonna = rand() % 13;

while (deck[riga][colonna] != 0) {
riga = rand() % 4; //= 0, 1, 2, 3.
colonna = rand() % 13;
}

deck[riga][colonna] = carta;
}
}

void distribuisciCarte(const int deck[][13], const char *face[], const char *suit[])
{
int carta, riga, colonna;

for (carta = 1 ; carta <= 52 ; carta++)

for (riga = 1 ; riga <= 52 ; riga++)

for (colonna = 1 ; colonna <= 52 ; colonna++)

if (deck[riga][colonna] == carta)
printf ("%5s di %-8s%c", face[colonna], suit[riga], carta % 2 == 0 ? '\n' : '\t');
}

Senza che lo leggete tutto, vi ho indicato con il rosso la riga su cui leggo il seguente errore:
" passing `char **' as argument 2 of `distribuisciCarte(const int (*)[13], const char **, const char **)' adds cv-quals without intervening `const' ".
Di che si tratta?
Ho provato ad eliminare il "const" dappertutto ed effettivamente il programma parte, ma funziona male (il seme funziona ma il valore è sballato, ottengo cose tipo "NULL" o caratteri a caso).

..::DAVE::..
28-08-2008, 22:05
il

void distribuisciCarte(const int[][13], const char *[], const char *[]);

const char*[] di fatto è una matrice e se non gli passi una larghezza il compilatore non ha modo di sapere quanto è larga

DanieleC88
29-08-2008, 06:21
Passi come const valori che, di fatto, non sono const (non li hai definiti così).

Trovi qui una spiegazione del perché non è una buona pratica: http://gcc.gnu.org/ml/gcc/1998-02/msg00067.html

ciao ;)

Composition86
29-08-2008, 10:02
il

void distribuisciCarte(const int[][13], const char *[], const char *[]);

const char*[] di fatto è una matrice e se non gli passi una larghezza il compilatore non ha modo di sapere quanto è larga
A quanto ho letto, non è necessario specificare il numero di righe.
L'esempio in questione è copiato dal libro, ho (abbiamo) controllato tutto e non ci sono errori di copiatura, la cosa è molto strana.

Passi come const valori che, di fatto, non sono const (non li hai definiti così).

Trovi qui una spiegazione del perché non è una buona pratica: http://gcc.gnu.org/ml/gcc/1998-02/msg00067.html

ciao ;)
Questa faccenda del const mi sta fecendo penare parecchio. :(
Ho provato ad aggiungere const nella dichiarazione delle variabili, che presumo fosse questo il problema. Ma ora il programma fa un ciclo correttamente (neanche sempre) e poi mi fa un errore fatale.
Ripeto che è una cosa copiata dal libro senza cambiare nulla.

DanieleC88
29-08-2008, 11:12
Con la correzione fatta, che errore ti genera?
E tanto per curiosità, di che libro si tratta?

Composition86
29-08-2008, 11:21
Errore nessuno, solo il malfunzionamento del programma. Ottengo cose tipo (sono 3 esecuzioni distinte del programma):

1) <null> di Cuori
2) (schermata nera)
3) Sette di quadri, <null> di Fiori,

Tutte finiscono con il classico errore di windows XP: "Si è verificato un errore ecc. ecc."

Il libro è "C, corso completo di programmazione" di Deitel&Deitel.

sottovento
29-08-2008, 11:26
void distribuisciCarte(const int deck[][13], const char *face[], const char *suit[])
{
int carta, riga, colonna;

for (carta = 1 ; carta <= 52 ; carta++)

for (riga = 1 ; riga <= 52 ; riga++)

for (colonna = 1 ; colonna <= 52 ; colonna++)

if (deck[riga][colonna] == carta)
printf ("%5s di %-8s%c", face[colonna], suit[riga], carta % 2 == 0 ? '\n' : '\t');
}


Siccome fai partire tutti gli indici da 1 fino a 52 incluso, andrai a sfondare la dimensione massima dei tuoi vettori, quindi causando crash o malfunzionamenti inspiegabili

Composition86
29-08-2008, 11:36
Siccome fai partire tutti gli indici da 1 fino a 52 incluso, andrai a sfondare la dimensione massima dei tuoi vettori, quindi causando crash o malfunzionamenti inspiegabili
Una bella svista! :doh:

Comincia a funzionare, c'è ancora qualcosa che non va con la tabulazione ma il più è fatto.

EDIT Andato, gli errori erano in:
for (riga = 1 ; riga <= 52 ; riga++)
for (colonna = 1 ; colonna <= 52 ; colonna++)
I due cicli for vanno eseguiti rispettivamente tra 0 e 3 e tra 0 e 12.

Non c'è più niente da dire su questo esercizio, ringrazio tutti!

d0c1Le.Killah
29-08-2008, 11:38
Perchè 52 righe e colonne???

Se nel main al posto della funzione incriminata, metti un banale:

for(int i = 0; i < 4; i++){
for(int j=0; j < 13; j++)
printf("%d\n", mazzo[i][j]);
}


vedrai che funziona bene...

Possibile che Deitel Senior e Jr. abbiano messo codice non funzionante?
Dite che quando il mio prof sparò a lezione la frase:"In fondo Deitel&Deitel... non sanno programmare! (a proposito dell'allocazione dinamica, ndr)" aveva ragione? :mbe:

Composition86
29-08-2008, 11:46
Si adesso ho risolto, un po' di errori li ho fatti io, ma effettivamente il libro ha omesso "const" nelle dichiarazioni delle variabili "char", cosa che causa l'errore che ho scritto nel primo post.