Bonjour
J'ai un bout de code qui plante curieusement sur un(ou Liberties est un tableau)
Code : Sélectionner tout - Visualiser dans une fenêtre à part delete [] Liberties;
Le code est lancé par cette fonction: (dont je ne met que le début)
Jusque là, il s'execute normalement, la fonction Addlib y est appellée corectement.
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 inline bool Goban::PlayMove(const point2D &pt){ if (GameTab[pt.X][pt.Y]==0 && pt!=Ko){ GroupStone *Gr=new GroupStone(pt,Player); AddGroup(*Gr); GameTab[pt.X][pt.Y]=NumGroups; // CHECKING LIBERTIES & Other's Groups if (pt.X!=0){ if(GameTab[pt.X-1][pt.Y]==0){ Gr->Addlib(point2D(pt.X-1,pt.Y)); }else{ //Rien d'intéressant, le code ne passe pas par là } }
Voici la suite de la fonction:ici, il plante sur Addlib
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 int u=0; if (pt.X!=Sz){ if(GameTab[pt.X+1][pt.Y]==0){ Gr->Addlib(point2D(pt.X+1,pt.Y));// CA PLANTE ICI }else{ //rien d'interessant ici non plus }} ...//je met pas la fin }
En voici donc la déclaration:
à la premiere execution, tout se passe bien à la seconde execution, il plante sur Dellib (lib);
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 void GroupStone::Addlib(const point2D & lib){//should not be called if the group is empty cout<<"Addlib "<<lib.X<<" "<<lib.Y<<endl; int ad=0; if (inited){ Dellib(lib);//ça plante là la seconde fois !! point2D *plib= new point2D [Numlib]; for (int i=0;i<Numlib-1;i++) plib[i]=Liberties[i]; plib[Numlib]=lib; delete []Liberties; Liberties=plib; Numlib++; }else{ //rien d'interessant } }
voici donc le code de cette fonction:
De même, l'execution de cette fonction est impeccable au premier passage et plante au second sur le
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 void GroupStone::Dellib(const point2D &lib){ int del=0; point2D *prov= new point2D [Numlib]; int overlib=0;//if the liberty is finded for(int i=0;i<Numlib;i++){ if (Liberties[i]==lib){ overlib++; }else{ prov[i-overlib]=Liberties[i];} } delete []Liberties; //ça plante là au second passage Liberties=prov; }Par ailleur, j'ai vérifié que au moment ou s'execute le delete []Liberties; pour la seconde fois, Liberties est un tableau de 1 valeur (donc non vide)...
Code : Sélectionner tout - Visualiser dans une fenêtre à part delete []Liberties;
si vous avez une idée...
Merci d'avance et désolé pour vos cheveux![]()
Partager