Bonjour.
Mon problème est un peu complexe.
J'essai d'implémenter l'algorithme A* (pathfinding).
Pour cela j'ai une class 'Noeud' qui possède un pointeur vers une autre instance de la class 'Noeud'.
Dans la boucle de recherche j'utilise le conteneur 'Deque'.
Or quant on parcours la liste fermée une fois le chemain trouvé, on s'aperçoit que tous les éléments de la liste fermée ont leur pointeur respectif qui pointent tous vers le même élément (le dernier Noeud trouvé)


Le vous donne une version simplifiée du code...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
 
class Noeud
{
public:
Noeud *Parent; //Parent est un pointeur sur le noeud parent.
 
//-----------Constructeur de recopie---------------------------------------
 Noeud (const Noeud &a)
       {
       Parent=a.Parent;     
       }    
//-----------Constructeur de recopie---------------------------------------
 
//++++++++++++++++opérateurs+++++++++++++++++++++++++++++++++
 
//operateur = surchargé
 Noeud & operator=( const Noeud &a )
 { 
 Parent=a.Parent;
 return (*this);
 }   
//operateur = surchargé
 
//operateur () surchargé
 Noeud & operator()( Noeud *B)
 { 
 Parent=B;
 return (*this);
 }   
//operateur () surchargé
//++++++++++++++++opérateurs+++++++++++++++++++++++++++++++++
};
 
 
 
class A_star
{
public:
 deque<Noeud> Open;   //Liste ouverte de la recherche.
 deque<Noeud> Closed; //Liste fermée de la recherche.
 
Noeud Depart, Arriver;         //Le départ et arrivée du chemain. 
 
 
//-----------Constructeur-------------------------------------------------
 A_star(int X_depart, int Y_Arriver, int X_fin, int Y_arriver) 
      : Depart(X_depart, Y_Arriver,1000), Arriver(X_fin, Y_arriver)
  {
  Depart.Parent=0;  //Depart est le seul Noeud à ne pas avoir de parent.
   }
//-----------Constructeur-------------------------------------------------
 
 
//********************************************************
 void Recherche_Chemain()
 {      
 Noeud Courant;
 Noeud *CC=&Depart;
 
 Open.push_front(Depart);
 
    while( !Open.empty() )//Boucle de la recherche.
   {
   Noeud Test(0,0,100000);//Création d'un Noeud avec un 'F' de 100000.
   Test.Parent=0;
 
      for(int i=0; i<Open.size(); i++)//On cherche le plus petit élément de Open
      {
        if( Open[i] < Test) //On se sert du poid F.
        Test=Open[i];      
      }
 
 
 
 
      for(int i=0; i<Open.size(); i++)//On suprime ce pluspetit élément de Open    
        if( Open[i]==Test)
        Open.erase( Open.begin()+i);
 
 
 
   Courant=Test;// Courant est le Noeud avec le 'F' le plus faible de 'Open'
   Closed.push_front(Courant); Et on le met dans Closed 
 
 
 
     if(Courant==Arriver)//Si on est arrivé.
     {
     return;             //On arrête de chercher.
     }
     else
     {
     CC=&Courant;// CC est un pointeur sur le Noeud courant.
//Au nord     
       Test(CC);//Opérateur ().
 
       Test.y-=1;//On change les coordonnées de Test pour calculer le poid de ce Noeud.
//Toutes les autres case sont analysée de la même manière, seules les coordonnées de Test changent.
       if(Les condition sont peu importantes)
       {
       Test.Calcul_F(Arriver);// On calcul le poid de la case.
       Open.push_front(Test); //On ajoute Test à la liste ouverte
       }   
 
 
    }
 
   }//Fin de la boucle de la recherche.
   cout<<"Pas de chemain"<<endl;
 
 }
//********************************************************
 
};
 
 
int main(int argc, char *argv[])
{
 
A_star A(1,1,9,9);
A.Recherche_Chemain();
 
    system("PAUSE");
    return EXIT_SUCCESS;
}
J'ai enlevé tous ce qui n'a pas de rapport avec les pointeur.
Si vous voyez une erreur, merci de me le dire