PDA

Visualizza la versione completa : [C++] Problema con l'operatore -> in un ciclo for


LeopardoFirenze
16-02-2013, 16:37
Salve a tutti, mi sono appena iscritto e mi piacerebbe mostrarvi questo piccolo pezzo di codice che mi sta dando 2 grattacapi.. :dhò:
Premetto che è un annetto che non uso C++ , lo sto ristudiando ultimamente perchè volevo riprenderci la mano per dare l'esame di C++ della mia facoltà..

Sostanzialmente, per esercizio, volevo creare un programma per giocare a texas holdem heads up contro il pc ma sono ancora all'inizio..vi espongo il problema e vi mostro il codice:


PRIMO PROBLEMA:
Ho definito una classe Card:


#include <iostream>
class Card{
public:
Card(int n,const char *s,int n1):number(n),seed(*s),numDeck(n1){
std::cout<<"\nCreata nuova carta. Numero: "<<n <<" Seme: "<<s<<" Numero nel mazzo: "<< n1; }
int getNumber();
private:
int number;
char seed;
int numDeck;
};

Card.cpp non lo riporto (c'è solo l'implementazione di getNumber() { return number; } )

Dopodichè ho definito una classe Cards:


#include "Card.h"
class Cards{
public:
Cards();
Card* arrayCarte [52];
Card* temp;
};

Vi mostro anche il costruttore di questa classe Cards:



#include "Cards.h"
Cards::Cards(){
int n=0;
for(int i=0;i<13;i++){
arrayCarte[i] = new Card(i+1,"C",n+1);
n++;
}
for(int i=0;i<13;i++){
arrayCarte[i] = new Card(i+1,"D",n+1);
n++;
}
for(int i=0;i<13;i++){
arrayCarte[i] = new Card(i+1,"F",n+1);
n++;
}
for(int i=0;i<13;i++){
arrayCarte[i] = new Card(i+1,"P",n+1);
n++;
}
//PERCHE' NON SI PUO USARE L'OPERATORE -> IN UN CICLO??? ...E' POSSIBILE USARLO SOLO CON UN BINDING DINAMICO???
//for(int i=0;i<52;i++){
std::cout<<"\n"<<arrayCarte[0]->getNumber();
std::cout<<"\n"<<arrayCarte[1]->getNumber();
std::cout<<"\n"<<arrayCarte[2]->getNumber();
std::cout<<"\n"<<arrayCarte[3]->getNumber();
std::cout<<"\n"<<arrayCarte[4]->getNumber();
//}
}

Guardate le ultime righe , dove si va a stampare il numero delle carte . Ecco se questa operazione la faccio con un ciclo for (che ho commentato), il programma smette di funzionare ("Windows: è in corso una ricerca del problema...")..
Anziani e saggi programmatori, illuminatemi!!


SECONDO PROBLEMA:
Sostanzialmente credo si tratti del solito problema, in un altro pezzo di codice:
Ecco qui la Classe Mazziere. Questa classe ha una funzione che mescola le carte (che ho trovato qui http://www.fredosaurus.com/notes-cpp/misc/random-shuffle.html e riadattato, molto probabilmente, male, per funzionare con un array di puntatori ad oggetti di tipo Card)





#include "Cards.h"
class Dealer{
public:
Dealer();
void shuffle();
private:
Cards deck; };

Dealer.cpp:



#include "Dealer.h"
#include <cstdlib> // for srand and rand
#include <ctime>
#include <iostream>
Dealer::Dealer(){ }

void Dealer::shuffle(){
std::cout<<"\nIl mazziere mescola le carte..." << std::endl;
srand(time(0));

//--- Shuffle elements by randomly exchanging each with one other.
for (int i=0; i<(52-1); i++) {
int r = i + (rand() % (52-i)); // Random remaining position.
//cout di debug
std::cout<<"\n\nPRIMA DELLO SWAP:\ndeck.temp= "<<deck.temp<<"\ndeck.arrayCarte["<<i<<"]= "<<deck.arrayCarte[i]<<"\ndeck.arrayCarte["<<r<<"]= "<<deck.arrayCarte[r];

deck.temp = deck.arrayCarte[i];
deck.arrayCarte[i] = deck.arrayCarte[r];
deck.arrayCarte[r] = deck.temp;
//cout di debug
std::cout<<"\nDOPO LO SWAP:\ndeck.temp= "<<deck.temp<<"\ndeck.arrayCarte["<<i<<"]= "<<deck.arrayCarte[i]<<"\ndeck.arrayCarte["<<r<<"]= "<<deck.arrayCarte[r];
}

for(int h=0;h<52;h++){
std::cout << ( deck.arrayCarte[h]->getNumber() ) ; // Just print number

}
}


Anche qui nelle ultime righe del Dealer.cpp c'è il solito ciclo for che crea il problema.
Inoltre se invece del ciclo for, ci mettiamo:



std::cout << ( deck.arrayCarte[0]->getNumber() ) ; // Just print number
std::cout << ( deck.arrayCarte[1]->getNumber() ) ;
std::cout << ( deck.arrayCarte[2]->getNumber() ) ;

fino ad arrivare alla posizione 52, il valore del numero della carta è sballato: tipo 3674600 oppure 1076889761...

Ora, sicuramente qui avrò sbagliato ad usare i puntatori..perdonate l'incompetenza e , se avete voglia, magari mi dite dov'è l'errore.. :stordita:

Ringrazio in anticipo! :unz:

boots
16-02-2013, 20:07
for(int i=0;i<13;i++){
arrayCarte[i] = new Card(i+1,"C",n+1);
n++;
}
for(int i=0;i<13;i++){
arrayCarte[i] = new Card(i+1,"D",n+1);
n++;
}
for(int i=0;i<13;i++){
arrayCarte[i] = new Card(i+1,"F",n+1);
n++;
}
for(int i=0;i<13;i++){
arrayCarte[i] = new Card(i+1,"P",n+1);
n++;
}


Se in ogni ciclo, ri-inizializzi i = 0, andrai sempre ad assegnare solo i primi 13 elementi dell'array. Tra l'altro perdendo i puntatori agli oggetti che hai creato nei primi tre cicli. Da qui, se provi ad accedere alle posizioni >12 mandi tutto in crash, visto che non si sa a cosa puntano

LeopardoFirenze
17-02-2013, 13:07
Cristo santo , ho messo le i al posto di n...
grazie per avermelo fatto notare... :love:

Loading