[C++] réassignement de pointeur

Résolu
Sigel Messages postés 6 Date d'inscription   Statut Membre Dernière intervention   -  
kilian Messages postés 8732 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

j'ai un problème dans le carde d'un projet de jeu d'echec. Lorsque j'essaie de réassigner un pointeur mon programme plante. Mon code est de ce genre:

Piece* m_chessboard[8][8];


m_chessboard[0][1] = new Pion(0,1,"blanc");
m_chessboard[0][2] = NULL;


(avec Piece classe parente de Pion bien sur)
jusque là tout va bien...j'initialise tout le tableau mais seule cette partie m'intéresse et ensuite

m_chessboard[0][2]=m_chessboard[0][1];
m_chessboard[0][1]=NULL;


la deuxième partie fait planté le programme lorsque je tente d'accéder aux pointeurs. Je n'utilise pas de référence donc je devrait pouvoir réassigner mes pointeurs sur des objets d'un même type (à moins que j'ai mal compris la théorie).

Je serai reconnaissant si quelqu'un pouvais me dire ce que je fais faux.


Merci d'avance

5 réponses

kilian Messages postés 8732 Date d'inscription   Statut Modérateur Dernière intervention   1 526
 
Ca à l'air bon. Tu pourrais poster le code en entier?
0
Sigel Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
 
voilà le code tel qu'il est écrit...je vais éviter d'écrire la totalité de mon code source ca prendrai des pages et des pages...tout ce qui à une importance est là. La méthode Piece::tesbouger fonctionne est n'est là que pour le vérifier que le déplacement de la pièce est en accord avec les régles.

Chessboard::Chessboard() : m_blanc("blanc"), m_noir("noir")
{

    for(int i=0;i<=7;i++)
    {
        for(int j=0;j<=7;j++)
        {
            switch(j)
            {
                case 0:
                {
                    switch(i)
                    {
                        case 0:
                        {
                            m_chessboard[i][j] = new Tour(i,j,"blanc");
                            break;
                        }
                        case 1:
                        {
                            m_chessboard[i][j] = new Cavalier(i,j,"blanc");
                            break;
                        }
                        case 2:
                        {
                            m_chessboard[i][j] = new Fou(i,j,"blanc");
                            break;
                        }
                        case 3:
                        {
                            m_chessboard[i][j] = new Dame(i,j,"blanc");
                            break;
                        }
                        case 4:
                        {
                            m_chessboard[i][j] = new Roi(i,j,"blanc");
                            break;
                        }
                        case 5:
                        {
                            m_chessboard[i][j] = new Fou(i,j,"blanc");
                            break;
                        }
                        case 6:
                        {
                            m_chessboard[i][j] = new Cavalier(i,j,"blanc");
                            break;
                        }
                        case 7:
                        {
                            m_chessboard[i][j] = new Tour(i,j,"blanc");
                            break;
                        }

                    }
                    break;
                }
                case 1:
                {
                    m_chessboard[i][j] = new Pion(i,j,"blanc");
                    break;
                }
                case 6:
                {
                    m_chessboard[i][j] = new Pion(i,j,"noir");
                    break;
                }
                case 7:
                {
                    switch(j)
                    {
                        case 0:
                        {
                            m_chessboard[i][j] = new Tour(i,j,"noir");
                            break;
                        }
                        case 1:
                        {
                            m_chessboard[i][j] = new Cavalier(i,j,"noir");
                            break;
                        }
                        case 2:
                        {
                            m_chessboard[i][j] = new Fou(i,j,"noir");
                            break;
                        }
                        case 3:
                        {
                            m_chessboard[i][j] = new Dame(i,j,"noir");
                            break;
                        }
                        case 4:
                        {
                            m_chessboard[i][j] = new Roi(i,j,"noir");
                            break;
                        }
                        case 5:
                        {
                            m_chessboard[i][j] = new Fou(i,j,"noir");
                            break;
                        }
                        case 6:
                        {
                            m_chessboard[i][j] = new Cavalier(i,j,"noir");
                            break;
                        }
                        case 7:
                        {
                            m_chessboard[i][j] = new Tour(i,j,"noir");
                            break;
                        }
                    }
                    break;
                }
                default:
                {
                    m_chessboard[i][j] = NULL;
                }
            }
        }
    }
}


void Chessboard::bougerPiece(int x1, int y1, int x2, int y2)
{
    Piece* pieceABouger = Chessboard::getPiece(x1,y1);
    if(pieceABouger->testbouger(x2,y2))
    {
        setPiece(x2, y2, pieceABouger);
        m_chessboard[x1][y1] = NULL;
    }
}

Piece* Chessboard::getPiece(int x, int y)
{
    return m_chessboard[x][y];
}

void Chessboard::setPiece(int x, int y, Piece *cible)
{
    m_chessboard[x][y] = cible;
}

0
kilian Messages postés 8732 Date d'inscription   Statut Modérateur Dernière intervention   1 526
 
Et du coup il plante comment ton programme? Ca fait un segfault ou?
0
Sigel Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
 
j'utilise ce code pour afficher:

void Jeu::afficher()
{
    cout<<"y"<<endl;
    for(int j=0;j<=7;j++)
    {
        cout<<endl;
        cout<<7-j<<"  ";
        for(int i=0;i<=7;i++)
        {
            if(m_echiquier.getPiece(7-i, j)!=NULL)
            {
                cout<<" "<<m_echiquier.getPiece(i, 7-j)->getNom()<<" ";
            }else
            {
                cout<<"    ";
            }
        }
        cout<<endl;
    }
    cout<<endl;
    cout<<"    0   1   2   3   4   5   6   7  x"<<endl;
}


lorsque j'affiche pour la première fois sans avoir bouger de pièce le programme fonctionne. Quand il essaie à nouveau d'afficher après avoir bouger les pièces , au moment ou il essaie d'afficher une des case qui a changé, le programme ne répond plus du tout. (fenêtre windows: JeuEchec.exe has stoppend working)

si j'enlève les lignes de bougerPiece
        setPiece(x2, y2, pieceABouger);
        m_chessboard[x1][y1] = NULL;


alors le programme ne freeze plus...mais bien sur mes pièces ne bougent pas :p
0
kilian Messages postés 8732 Date d'inscription   Statut Modérateur Dernière intervention   1 526
 
Ici:

if(m_echiquier.getPiece(7-i, j)!=NULL) 
{ 
    cout<<" "<<m_echiquier.getPiece(i, 7-j)->getNom()<<" "; 
}


Tu vérifies que getPiece(7-i, j) existe, mais tu sembles plutôt interessé par getPiece(i, 7-j), n'est ce pas? L'un peut être NULL, l'autre peut ne pas l'être.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Sigel Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
 
...oh mon dieu...j'ai relu cette partie des dizaines de fois sans le voir...merci mille fois!!!

en effet mon porgramme fonctionne maintenant.
0
kilian Messages postés 8732 Date d'inscription   Statut Modérateur Dernière intervention   1 526
 
:-)
0