PDA

View Full Version : [C++]Aiuto con sette e mezzo


KNX
04-09-2006, 19:52
Allora avrei un problemino su questo sorgente che in un futuro prossimo dovrà diventare un sette e mezzo :)

Questo è il codice:

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <ctime>

using namespace std;

const int MAX_ROWS = 5;
const int MAX_COLUMNS = 11;

class Carta
{
public:
Carta();
Carta(int num, string se);

void generaCarta(Carta* mazzoide[MAX_ROWS][MAX_COLUMNS]);

void print() const;
private:
int numero;
string seme;
};

Carta::Carta(){}

Carta::Carta(int num, string se)
{
numero = num;
seme = se;
}

void Carta::print() const
{
cout<<numero<<" di "<<seme<<endl;
}

void Carta::generaCarta(Carta* mazzoide[MAX_ROWS][MAX_COLUMNS])
{
srand (time(0));

int randseme = rand() % 4;
int randnumero = rand() % 10;

if(mazzoide[randseme][randnumero] == NULL)
generaCarta(mazzoide);
else mazzoide[randseme][randnumero]->print();

mazzoide[randseme][randnumero] = NULL;

}

int main()
{
int righe_seme = 4;
int colonne_numero = 10;
int i = 1;

Carta* mazzo[righe_seme][colonne_numero];
for(int j = 0;j<colonne_numero;j++)
{
mazzo[0][j] = new Carta(i, "coppe");
mazzo[1][j] = new Carta(i, "denari");
mazzo[2][j] = new Carta(i, "bastoni");
mazzo[3][j] = new Carta(i, "spade");
i++;
}

for(int i=0;i<righe_seme;i++)
{
for(int j=0;j<colonne_numero;j++)
{
mazzo[i][j]->print();
}
}

generaCarta(mazzo);

}


ecco il problema è che quando lo vado a compilare mi scappa fuori che:
"error: generaCarta undeclared (first use this function)"

bho sarà una boiata ma la mia mente ottusa non trova niente di sbagliato
P.S.: nn è da molto che programmo...

grazie mille in anticipo

andbin
04-09-2006, 20:54
ecco il problema è che quando lo vado a compilare mi scappa fuori che:
"error: generaCarta undeclared (first use this function)"Ci sono diverse cose da sistemare:

a) il metodo generaCarta suppongo che si voglia renderlo di "classe" e non di istanza. In pratica nella dichiarazione della classe metti static davanti alla dichiarazione del metodo.

b) Quando chiami quel metodo dovresti usare: Carta::generaCarta(mazzo);

c) La dichiarazione di mazzo che fai nel main non è comunque compatibile con il parametro di generaCarta.


P.S.: io comunque avrei scelto un'altra strada: creare una classe Carta che incapsula solamente i dati della carta e una classe Mazzo che contiene al suo interno tutto il mazzo e con un metodo estrai() che estrae una carta (togliendola) dal mazzo. ;)

KNX
04-09-2006, 21:41
Ok ho capito tutto grazie mille adesso cmq provo con la tua strada molto più efficiente che stupido sono stato a non pensarci...

però ho ancora una domanda: perchè la dichiarazione di mazzo nel main non è compatibile col parametro di generaCarta? A generaCarta non dovrei passare un array di puntatori di tipo Carta?

grazie mille

andbin
05-09-2006, 08:59
però ho ancora una domanda: perchè la dichiarazione di mazzo nel main non è compatibile col parametro di generaCarta? A generaCarta non dovrei passare un array di puntatori di tipo Carta?Sì, un array bidimensionale di puntatori a Carta.

generaCarta ha il parametro dichiarato:

Carta* mazzoide[MAX_ROWS][MAX_COLUMNS]

(che sarebbe come dire Carta* mazzoide[5][11])

mentre invece nel main è dichiarato:

Carta* mazzo[righe_seme][colonne_numero];

(che sarebbe come dire Carta* mazzo[4][10]; visti i valori delle 2 variabili)

Il compilatore comunque li vede come tipi diversi.


P.S.: tra l'altro non serve a molto (se non c'è una ragione precisa) usare un array bidimensionale per tenere tutte le carte. Puoi usare un semplice array monodimensionale.

KNX
05-09-2006, 11:47
Ok tutto chiaro adesso...
per quanto riguarda l'array l'avevo fatto bidimensionale per rendere ancora più casuale l'estrazione della carte dal mazzo... ma in effetti adesso che mi ci fai pensare una bidimensione è alquanto inutile... :(

ho ancora molta strada da fare purtroppo... :mc: