[C++] réassignement de pointeur

Résolu/Fermé
Sigel Messages postés 6 Date d'inscription mardi 11 janvier 2011 Statut Membre Dernière intervention 20 janvier 2011 - 20 janv. 2011 à 21:15
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 - 20 janv. 2011 à 22:33
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 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
20 janv. 2011 à 21:34
Ca à l'air bon. Tu pourrais poster le code en entier?
0
Sigel Messages postés 6 Date d'inscription mardi 11 janvier 2011 Statut Membre Dernière intervention 20 janvier 2011
20 janv. 2011 à 21:59
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 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
20 janv. 2011 à 22:06
Et du coup il plante comment ton programme? Ca fait un segfault ou?
0
Sigel Messages postés 6 Date d'inscription mardi 11 janvier 2011 Statut Membre Dernière intervention 20 janvier 2011
20 janv. 2011 à 22:21
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 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
Modifié par kilian le 20/01/2011 à 22:28
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 mardi 11 janvier 2011 Statut Membre Dernière intervention 20 janvier 2011
20 janv. 2011 à 22:30
...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 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
20 janv. 2011 à 22:33
:-)
0