IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Bug sur un delete


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut Bug sur un delete
    Bonjour

    J'ai un bout de code qui plante curieusement sur un (ou Liberties est un tableau)

    Le code est lancé par cette fonction: (dont je ne met que le début)
    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à
    			}
                     }
    Jusque là, il s'execute normalement, la fonction Addlib y est appellée corectement.

    Voici la suite de la fonction:
    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
    }
    ici, il plante sur Addlib

    En voici donc la déclaration:
    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
    	}
    }
    à la premiere execution, tout se passe bien à la seconde execution, il plante sur Dellib (lib);

    voici donc le code de cette fonction:
    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;
     
     
     
    }
    De même, l'execution de cette fonction est impeccable au premier passage et plante au second sur le 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)...

    si vous avez une idée...

    Merci d'avance et désolé pour vos cheveux

  2. #2
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Si tu passait par des std::vector au lieu de ces tableaux tout moches ?
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  3. #3
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    		point2D *plib= new point2D [Numlib];
    ...
    		plib[Numlib]=lib;
    Ton tableau est de taille Numlib donc les indices vont de 0 à Numlib-1.

    Et voilà une très bonne raison pour, comme le suggère Davidbrcz, utiliser des std::vector et non des tableaux.

    MAT.

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Utilise valgrind pour que tu puisses remonter jusqu'à la première erreur.
    Apparemment, y'en a plus, c'est un vrai bordel.

Discussions similaires

  1. ORA-06502 sur un delete
    Par DBS dans le forum Oracle
    Réponses: 61
    Dernier message: 01/04/2005, 16h01
  2. événement sur INSERT, DELETE, UPDATE
    Par papouAlain dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 24/12/2004, 15h40
  3. Bug sur glColor3i !
    Par ZiZouJH dans le forum OpenGL
    Réponses: 23
    Dernier message: 04/06/2004, 10h21
  4. Bug sur la prorpiété required d'un TField avec ADO ???
    Par denrette dans le forum Bases de données
    Réponses: 6
    Dernier message: 04/11/2003, 11h04
  5. Page de rapport de bug sur le site de Sun
    Par piff dans le forum Général Java
    Réponses: 1
    Dernier message: 03/03/2003, 18h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo