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 :

tab[0][0], segmentation fault et constructeur de copie


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : développeur à la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 396
    Billets dans le blog
    16
    Par défaut tab[0][0], segmentation fault et constructeur de copie
    bonjour,

    tab[0][0] me donne segmentation fault

    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
    grille::grille(grille &copieGrille){
    	lieu **grilleNew;
    	grilleNew=new lieu*[9];
    	for(int y = 0; y < 9; y++){
    		grilleNew[y]=new lieu[9];
    	}
    	for(int ligne(0);ligne<9;ligne++)
    		for(int colonne(0);colonne<9;colonne++){
    			copieGrille.setChiffreGrille(ligne,colonne,
    																				this->getChiffreGrille(ligne,colonne));
    			for(int i(1);i<=9;i++)
    				if(getPossiblesGrille(ligne,colonne,i))
    					copieGrille.setPossiblesGrille(ligne,colonne,i);
    		}
    	for(int y = 0; y < 9; y++){
       	delete [] tab[y]; 
    	}
    	delete [] tab;
    	tab=grilleNew;
    	for(int y = 0; y < 9; y++){
       	delete [] grilleNew[y]; 
    	}
    	delete [] grilleNew;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    grille::grille(){
    	tab=new lieu*[9];
    	for(int y = 0; y < 9; y++){
        tab[y] = new lieu[9];
    	}
    }
     
    grille::~grille(){
    	for(int y = 0; y < 9; y++){
    		delete [] tab[y]; 
    	}
    	delete [] tab;
    }
    Le segmentation fault est ci-dessous avec ligne=0 et colonne=0
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int grille::getChiffreGrille(int ligne,int colonne){
    	return tab[ligne][colonne].getChiffre();
    }
    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
    #ifndef LIEU_HPP_
    #define LIEU_HPP_
    #include <vector>
    class lieu{
    private:
    	int chiffre;
    	std::vector<int> possibles;
    public:
    	lieu operator=(lieu copieLieu);
    	int getChiffre();
    	bool getPossibles(int indice);
    	void setChiffre(int indice);
    	void setPossibles(int i);
    	void unsetPossibles(int indice);
    	bool possibleUnique();
    	int quelUnique();
    	void lieuZero();
    //	int dernierPossible();
    };
    #endif
    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
    #ifndef GRILLE_HPP
    #define GRILLE_HPP
    #include "lieu.hpp"
    class grille{
    private:
    	lieu **tab;
    public:
    	grille();
    	~grille();
    	grille(grille &copieGrille);
    	bool absentLigne(int ligne,int chiffre);
    	bool absentColonne(int colonne,int chiffre);
    	bool absentBloc(int bloc,int chiffre);
    	bool grilleIncomplete();
    	int getChiffreGrille(int ligne,int colonne);
    	void setChiffreGrille(int ligne,int colonne,int chiffre);
    	bool getPossiblesGrille(int ligne,int colonne,int indice);
    	void setPossiblesGrille(int ligne,int colonne,int indice);
    	void zeroGrille();
    	void init();
    	void indicer();
    	void resoudre();
    	void afficher();
    	void afficherIndices();
    	bool alignementVerticalBloc(int bloc,int colonne,int indice);
    	bool alignementHorizontalBloc(int bloc,int ligne,int indice);
    	void supprimerChiffreLigne(int bloc,int ligne,int occurence);
    	void supprimerChiffreColonne(int bloc,int colonne,int occurence);
    	bool uniqueLigne(int ligne,int chiffre);
    	bool uniqueColonne(int colonne,int chiffre);
    	bool uniqueBloc(int bloc,int chiffre);
    };
     
    #endif
    quelqu'un a une idée?

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 150
    Billets dans le blog
    4
    Par défaut
    Salut,

    tu te serais pas un peu tout mélangé ?
    Ca ressemble vaguement à un constructeur par copie, sauf que ton argument est loin d'être const, et tu le modifies alors que tab de ton nouvel objet n'est absolument jamais géré, ni initialisé. Tu travailles sur un grilleNew qui n'a rien à voir.
    Tu l'initialises uniquement dans le constructeur par défaut, mais il n'est pas appelé si le constructeur par copie est appelé.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre éclairé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : développeur à la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 396
    Billets dans le blog
    16
    Par défaut
    merci Bousk, j'avais pas réalisé que l'objet à copier était celui en argument:

    j'ai donc réécrit le constructeur comme ceci (messages d'erreur):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    grille::grille(grille const& copieGrille){
    	for(int ligne(0);ligne<9;ligne++)
    		for(int colonne(0);colonne<9;colonne++){
    			this->setChiffreGrille(ligne,colonne,copieGrille.getChiffreGrille(ligne,colonne));
    			for(int i(1);i<=9;i++)
    				if(copieGrille.getPossiblesGrille(ligne,colonne,i))
    					this->setPossiblesGrille(ligne,colonne,i);
    		}
    }
    g++ me donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    grille.cpp: In copy constructor ‘grille::grille(const grille&)’:
    grille.cpp:33:59: error: passing ‘const grille’ as ‘this’ argument of ‘int grille::getChiffreGrille(int, int)’ discards qualifiers [-fpermissive]
                     copieGrille.getChiffreGrille(ligne,colonne));
                                                               ^
    grille.cpp:35:54: error: passing ‘const grille’ as ‘this’ argument of ‘bool grille::getPossiblesGrille(int, int, int)’ discards qualifiers [-fpermissive]
         if(copieGrille.getPossiblesGrille(ligne,colonne,i))
                                                          ^
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    bool grille::getPossiblesGrille(int ligne,int colonne,int indice){
    	return tab[ligne][colonne].getPossibles(indice);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void grille::setPossiblesGrille(int ligne,int colonne,int indice){
    	tab[ligne][colonne].setPossibles(indice);
    }
    je ne comprends pas très bien ces messages d'ereur

  4. #4
    Membre éclairé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : développeur à la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 396
    Billets dans le blog
    16
    Par défaut
    en fait, la grille est la même dans les deux objet.
    il faudrait qu'un nouveau tableau de lieu soit créé dans l'objet cible.

  5. #5
    Membre éclairé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : développeur à la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 396
    Billets dans le blog
    16
    Par défaut
    j'ai fait comme ceci,mais j'ai toujours des messages d'erreur:
    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
    grille::grille(grille const& copieGrille){
    	int x;
    	lieu **grilleNew;
    	grilleNew=new lieu*[9];
    	for(int y = 0; y < 9; y++){
    		grilleNew[y]=new lieu[9];
    	}
    	for(int ligne(0);ligne<9;ligne++)
    		for(int colonne(0);colonne<9;colonne++){
    			x=copieGrille.getChiffreGrille(ligne,colonne);
    			grilleNew[ligne][colonne].setChiffre(x);
    			for(int i=1;i<=9;i++)
    				if(copieGrille.getPossiblesGrille(ligne,colonne,i))
    					setPossiblesGrille(ligne,colonne,i);
    		}
    	for(int y = 0; y < 9; y++){
       	delete [] tab[y]; 
    	}
    	delete [] tab;
    	tab=grilleNew;
    	for(int y = 0; y < 9; y++){
       	delete [] grilleNew[y]; 
    	}
    	delete [] grilleNew;
    }
    g++ me donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    grille.cpp: In copy constructor ‘grille::grille(const grille&)’:
    grille.cpp:33:48: error: passing ‘const grille’ as ‘this’ argument of ‘int grille::getChiffreGrille(int, int)’ discards qualifiers [-fpermissive]
        x=copieGrille.getChiffreGrille(ligne,colonne);
                                                    ^
    grille.cpp:36:54: error: passing ‘const grille’ as ‘this’ argument of ‘bool grille::getPossiblesGrille(int, int, int)’ discards qualifiers [-fpermissive]
         if(copieGrille.getPossiblesGrille(ligne,colonne,i))
                                                          ^
    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
    class lieu{
    private:
    	int chiffre;
    	std::vector<int> possibles;
    public:
    	//lieu operator=(lieu copieLieu);
    	int getChiffre();
    	bool getPossibles(int indice);
    	void setChiffre(int indice);
    	void setPossibles(int i);
    	void unsetPossibles(int indice);
    	bool possibleUnique();
    	int quelUnique();
    	void lieuZero();
    //	int dernierPossible();
    };
    quelqu'un a une idée?

  6. #6
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Dans "passing const bidule as truc discards qualifier", le qualifieur est const.
    Le problème est que le pointeur ou la référence truc désigne une variable modifiable, mais que tu essaie de l'initialiser vers une constante.
    La solution est de rendre le pointeur ou la référence constante.

    Quand il s'agit de this, c'est qu'il faut définir la fonction comme portant sur une constante. C'est fait en ajoutant le mot clé const après les arguments.

    Par exemple, il faut que getChiffreGrille soit défini ainsi int grille::getChiffreGrille(int, int) const.
    Au passage, comme c'est une fonction membre de grille, il est inutile de préciser à nouveau grille dans son nom.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Pb segmentation fault avec glutinit()
    Par pipistrelle dans le forum GLUT
    Réponses: 2
    Dernier message: 17/11/2004, 23h17
  2. [SDL_Image] Img_Load : segmentation fault ....
    Par Mathieu.J dans le forum OpenGL
    Réponses: 6
    Dernier message: 19/10/2004, 23h52
  3. [REDHAT] Segmentation fault systematique
    Par mela dans le forum RedHat / CentOS / Fedora
    Réponses: 2
    Dernier message: 21/09/2004, 06h05
  4. Réponses: 13
    Dernier message: 13/07/2004, 15h41
  5. Comment contrer la "segmentation fault" ?
    Par guillaume_pfr dans le forum C
    Réponses: 15
    Dernier message: 08/08/2003, 13h43

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