[C++] réassignement de pointeur [Résolu/Fermé]

Signaler
Messages postés
6
Date d'inscription
mardi 11 janvier 2011
Statut
Membre
Dernière intervention
20 janvier 2011
-
kilian
Messages postés
8896
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
-
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

Messages postés
8896
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1376
Ca à l'air bon. Tu pourrais poster le code en entier?
Messages postés
6
Date d'inscription
mardi 11 janvier 2011
Statut
Membre
Dernière intervention
20 janvier 2011

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;
}

Messages postés
8896
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1376
Et du coup il plante comment ton programme? Ca fait un segfault ou?
Messages postés
6
Date d'inscription
mardi 11 janvier 2011
Statut
Membre
Dernière intervention
20 janvier 2011

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
kilian
Messages postés
8896
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1376
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.
Messages postés
6
Date d'inscription
mardi 11 janvier 2011
Statut
Membre
Dernière intervention
20 janvier 2011

...oh mon dieu...j'ai relu cette partie des dizaines de fois sans le voir...merci mille fois!!!

en effet mon porgramme fonctionne maintenant.
kilian
Messages postés
8896
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1376
:-)