Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [C++] Problema con l'operatore -> in un ciclo for

    Salve a tutti, mi sono appena iscritto e mi piacerebbe mostrarvi questo piccolo pezzo di codice che mi sta dando 2 grattacapi..
    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:

    codice:
    #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:
    codice:
    #include "Card.h" 
    class Cards{ 
    public:
        Cards();
        Card* arrayCarte [52];
        Card* temp; 
    };
    Vi mostro anche il costruttore di questa classe Cards:

    codice:
    #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...m-shuffle.html e riadattato, molto probabilmente, male, per funzionare con un array di puntatori ad oggetti di tipo Card)



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

    codice:
    #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:

    codice:
    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..

    Ringrazio in anticipo!

  2. #2
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    codice:
    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

  3. #3
    Cristo santo , ho messo le i al posto di n...
    grazie per avermelo fatto notare...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.