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 :

Seg fault sur une class matrice


Sujet :

C++

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 28
    Par défaut Seg fault sur une class matrice
    Bonjour,

    Je programme une classe matrice, héritant d'une classe vecteur (un tableau qui connais sa taille).

    Malheureusement, je me tape un segmentation fault a chaque fois que je veux toucher à ma matrice ... je comprend pas :/

    ___Vecteur

    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
     
    class Vecteur
    {
    	int taille;
    	double* value;
     
    	public:
     
    	Vecteur(int=1);
    	~Vecteur();
            void vectrand(int n=10);
    };
     
    Vecteur::Vecteur(int n)
    {
    	int i;
     
    	taille=n;
    	value = new double[n];
     
    	for(i=0; i<n; i++)
    		value[i]=0;
    }
     
     
    Vecteur::~Vecteur()
    {
    	delete[] value;
    }
     
    void Vecteur::vectrand(int n)
    {
    	int i;
     
    	for(i=0; i<taille; i++)
    		value[i]= rand()%n;
    }
    __Matrice
    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
     
    class Matrice : public Vecteur
    {
    	int line;
    	Vecteur** tvect;
     
    	public:
     
    	Matrice(int col=1, int line=1);
    	void matrand(int n=10);
    	Vecteur& operator[](int)const;
    };
    //Je verrai plus tard pour le destructeur ^^
     
    Matrice::Matrice(int line, int col)
    {
    	int i;
     
    	assert(line>0 && col>0);
     
    	this->line = line;
     
    	Vecteur** tvect = new  Vecteur*[line];
     
    	for(i=0; i<line; i++)
    		tvect[i] = new Vecteur(col);
    }
     
    Vecteur& Matrice::operator[](int i)const
    {
    	return (*tvect)[i];
    }
     
    void Matrice::matrand(int n)
    {
    	int i;
     
    	for(i=0; i<line; i++)
    		(*this)[i].vectrand(n);	
    }

    Merci d'avance !

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Là, tu te retrouve au final avec quelque chose à trois dimensions, vu que tu as une dimention dans le vecteur et deux autres dans ta matrice... je doute sincèrement que ce soit ce dont tu as besoin

    De plus, tel que ton code apparait, tu mets tout en place pour être confronté à des problèmes sans nom:
    1. Si tu fais une copie de ta matrice (ou ne serait-ce que de ton vecteur!!!), soit te retrouveras avec une double tentative de libération de la mémoire, soit tu te retrouveras à essayer d'accéder à un élément dont la mémoire a été libérée, à un moment ou à un autre
    2. Si l'allocation dynamique au niveau de la matrice échoue pour une raison ou une autre, tu auras une belle fuite mémoire
    3. La classe Matrice est un puits à fuite mémoire, même si tout se passe correctement
    Tous ces problèmes ont déjà été largement abordés à maintes reprises dans le forum, je vais donc te laisser un peu chercher tout seul (mais je suis tout disposé à expliquer le pourquoi du comment en cas de besoin )

    De plus, tu te fais beaucoup de mal pour pas grand chose, dans le sens où une matrice a la particularité remarquable, quand elle est composée de X lignes et de Y colonnes de contenir... X*Y éléments.

    Il est donc tout à fait possible de faire en sorte d'allouer directement l'espace pour ces X*Y éléments "d'une seule traite" .

    A ce moment là, il "suffira" d'utiliser la formule numéro_de_ligne * nombre_de_colonnes + numéro_de_colonne (qui sont autant de données parfaitement connue ) pour accéder à un élément particulier.

    Enfin, La gestion manuelle des allocations et désallocations de mémoire est un domaine où il est particulièrement facile de se tirer une balle dans le pied:
    Si on ne prévoit pas les bons constructeur par copie et opérateurs d'affectation, on se retrouve soit avec des fuites mémoire, soit avec des tentatives de double libération, soit avec des tentatives d'accès à des éléments dont la mémoire a été libérée (ce qui est ton cas), ouvrant la porte à des erreurs de segmentation

    Si on ne prévoit pas le destructeur correct, on se retrouve facilement avec des fuites mémoires (ce qui t'arrive aussi)

    Si on se limite à l'utilisation des pointeurs "nus", il est difficile de savoir "qui fait quoi" (comprends: qui s'occupe de l'allocation de mémoire, qui s'occupe de la libération de la mémoire, qui se repose sur qui pour quoi,...)

    Pour éviter tous ces soucis, C++ fournit, en standard, un ensemble de collections qui sont chacune adaptée à des besoins particuliers.

    Parmi ces collections, il y a entre autre la classe vector, disponible dans l'espace de noms std par simple inclusion du fichier d'en-tête <vector> et qui n'est rien d'autre qu'une encapsulation "correcte" d'un tableau d'éléments contigus en mémoire (ce que tu obtiens avec un new Type[X] ).

    Tu pourrais donc parfaitement envisager d'écrire une classe Matrice sous la forme de
    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
    class Matrice
    {
        public:
            Matrice(size_t lignes, size_t colonnes):internal_(lignes*colonnes),
                                               lignes_(lignes), 
                                               colonnes_(colonnes){}
            /* permet de changer la valeur du double indiqué */
            double & operator()(size_t ligne, size_t colonne)
            {
                assert(ligne < lignes_);
                assert(colonne < colonnes_);
                return interne_[ligne * colones_ + colonne);
            }
            /* accès en "lecture seule" */
            double operator()(size_t ligne, size_t colonne)
            {
                assert(ligne < lignes_);
                assert(colonne < colonnes_);
                return interne_[ligne * colones_ + colonne);
            }
            /* parce que cela peut etre utile ;) */
            size_t lignes() const{return lignes_;}
            size_t colonnes() const{return colonnes_;}
        private:
            std::vector<int> interne_;
            size_t lignes_;
            size_t colonnes_;
    }
    NOTA: je ne crois pas qu'il soit opportun de fournir une fonction membre qui remplisse la matrice de manière aléatoire.

    Ce n'est, à mon sens, pas un service que l'on est en droit d'attendre de la part de la matrice.

    De mon avis personnel, ce serait soit un service que l'on peut attendre de la part des objets qui manipulent la matrice soit un service "totalement indépendant" (une fonction libre ) que l'on peut appeler à notre gré depuis "n'importe où dans le code".

    Enfin, cette classe matrice pourrait être utilisée sous des formes proches de
    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
     
    void fillMatrixRandom(Matrice & mat, int max)
    {
        size_t lignes = mat.lignes();
        size_t colonnes = mat.colonnes();
        for (size_t i = ;i<lignes;++i)
        {
            for(size_t j = 0; j<colonnes; ++j)
            {
                mat(i,j)=rand() %max;
            }
        }
    }
    int main()
    {
        srand();
        Matrice mat( 10, 10);
        fillMatrixRandom(mat, 999);
        for(size_t i = 0;i<10;++i)
        {
            for(size_t j=0;j<10;++j)
            {
                std::cout<<mat(i,j)<<" ";
            }
            std::cout<<std::endl;
        }
    }
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 28
    Par défaut
    Merci pour tout

    Ma prof m'avais conseilé de passer par un pointeur sur un tableau de vecteur, je me rapelle plus pour quoi mais ca me semblais aussi assez compliqué pour pas grand chose ><


    par contre, pour ce qui est de vector, je ne vais pas l'utiliser J'estime que le but de l'apprentissage, c'est de se mettre un peu de baton dans les roues, si j'avais voulu, j'aurai pu DL une classe matrice toute prête et la rendre ...


    merci quand même !

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par Armas Voir le message
    Merci pour tout

    Ma prof m'avais conseilé de passer par un pointeur sur un tableau de vecteur, je me rapelle plus pour quoi mais ca me semblais aussi assez compliqué pour pas grand chose ><
    Encore une prof qui enseigne le C++ comme étant du C with classes!!!

    Proposes lui de faire un tour sur le forum, qu'on puisse essayer de la convaincre de se mettre à jour

    par contre, pour ce qui est de vector, je ne vais pas l'utiliser J'estime que le but de l'apprentissage, c'est de se mettre un peu de baton dans les roues, si j'avais voulu, j'aurai pu DL une classe matrice toute prête et la rendre ...
    Je ne suis mais alors là pas du tout d'accord avec ce principe.

    C++ est un excellent langage, mais il offre déjà bien assez d'occasion de se tirer une balle dans le pied sans devoir en rajouter une couche à chercher la difficulté là où il n'y en a pas besoin.

    Ne t'en fais pas, tu auras plus que largement l'occasion de devoir jouer avec l'allocation dynamique et de t'arracher les cheveux par la suite!

    Mais, avec un peu de chance, tu auras eu l'occasion d'évoluer tant au niveau de la conception qu'au niveau de la connaissance du langage, et, si tu as de la chance, tu seras peut etre en mesure d'identifier les plus gros pièges auxquels tu risques d'être confronté.

    Il y a énormément de marge entre le fait d'apprendre à utiliser ce qui est fourni par le standard et celui d'aller chercher une bibliothèque adaptée à un besoin particulier.

    Le premier cas te permet d'apprendre en n'ayant à t'inquiéter que de ce qui importe réellement (la syntaxe qu'il te faut apprendre, l'algorithmie, l'appréhension du langage, ...) et te servira de toutes manières tout au long de ta carrière de développeur C++, alors que le deuxième est clairement destiné à te faciliter la vie dans ton travail et à t'assurer de travailler avec quelque chose "aussi exempt de bug que possible" (ou du moins, c'est ce que l'on en attend).

    Ne vas pas croire que l'apprentissage du C++ sera "trop facile" si tu utilises la bibliothèque standard! Même en l'utilisant, tu viendras surement nous demander régulièrement des conseils, ne t'en fais pas
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 28
    Par défaut
    Je crois que mon probleme c'est que je pense toujours au C en programmant ...

    Ma classe matrice n'est toujours pas fonctionnel, je comprend pas -_-"

    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
     
    //a priori, ça marche, en tout cas j'ai pas d'erreur 
     
    Matrice::Matrice(int line, int col)
    {
    	int i;
     
    	assert(line>0 && col>0);
     
    	this->line = line;
     
    	Vecteur* tvect = new  Vecteur[line];
     
    	for(i=0; i<line; i++)
    		tvect[i] = Vecteur(col);
    }
     
    // mais << et rand ne fonctionnent pas et me faire encore un abandon core T_T
     
     
    ostream& operator<<(ostream& o, Matrice m)
    {
    	int i;
     
    	for(i=0; i<m.line; i++)
    		o << m.tvect[i] << endl;		
     
    	return o;
    }
     
    void Matrice::matrand(int n)
    {
    	int i;
     
    	for(i=0; i<line; i++)
    		tvect[i].vectrand(n);	
    }
    Tu peux m'expliquer pourquoi ? Même en regardant attentivement, je vois pas ce qui pose soucis ... j'ai l'impression d'être revenue 1 an en arriere quand j'avais jamais touché au pointeur -_-"

  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
    Utilise std::vector ou std::array (en C++11), qui possèdent les opérations requises: at(i) et size()

    Pour la matrice, commence par coder l'essentiel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class matrice {
    private:
        //ce qui te semble utile
    public:
        matrice(int hauteur, int largeur);//matrice vide
        explicit matrice(int taille);//pour les matrices carrées vides
        ~matrice();
     
        int& operator()(int ligne, int colonne);
        int operator()(int ligne, int colonne) const;
     
        int hauteur() const;
        int largeur() const;
    };
    C'est l'interface que doit avoir la matrice en tant qu'objet mathématique.

    puis rajoute les fonctions libre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    operator*(matrice const & a, matrice const & b);
    matrice operator+(matrice const & a, matrice const & b);
    matrice operator-(matrice const & a, matrice<T> const & b);
    std::vector<int> operator*(matrice const & m, std::vector<int> const & v);
    et la fonction membre int matrice::discriminant() const;.

    Je te conseille de jeter un œil à la faq sur le comment et le pourquoi du matrice::operator()(int ligne, int colonne)
    L'idéal serait les templates:
    Pour la matrice, commence par coder l'essentiel (remplace le template par int si ca te pose problème):
    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
    template <typename T> class matrice {
    private:
        //ce qui te semble utile
    public:
        typedef T element_t;
        matrice(int hauteur, int largeur);//matrice vide
        explicit matrice(int taille);//pour les matrices carrées vides
        ~matrice();
     
        element_t& operator()(int ligne, int colonne);
        const element_t& operator()(int ligne, int colonne) const;
     
        int hauteur() const;
        int largeur() const;
        element_t discriminant() const
    };
     
    template<typename T> operator*(matrice<T> const & a, matrice<T> const & b);
    template<typename T> matrice<T> operator+(matrice<T> const & a, matrice<T> const & b);
    template<typename T> matrice<T> operator-(matrice<T> const & a, matrice<T> const & b);
    template<typename T> std::vector<T> operator*(matrice<T> const & m, std::vector<T> const & v);

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 28
    Par défaut
    Tout ca ne repond pas à ma question :/

    Pour l'instant, on a vu les classes, l'heritage, la surcharges d'opérateurs etc, mais pas encore de templates, ni la classe vector, j'aimerai vraiment pouvoir faire mon programme sans utilisé tout ca ^^

  8. #8
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par Armas Voir le message
    Je crois que mon probleme c'est que je pense toujours au C en programmant ...

    Ma classe matrice n'est toujours pas fonctionnel, je comprend pas -_-"

    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
     
    //a priori, ça marche, en tout cas j'ai pas d'erreur 
     
    Matrice::Matrice(int line, int col)
    {
    	int i;
     
    	assert(line>0 && col>0);
     
    	this->line = line;
     
    	Vecteur* tvect = new  Vecteur[line];
     
    	for(i=0; i<line; i++)
    		tvect[i] = Vecteur(col);
    }
     
    // mais << et rand ne fonctionnent pas et me faire encore un abandon core T_T
     
     
    ostream& operator<<(ostream& o, Matrice m)
    {
    	int i;
     
    	for(i=0; i<m.line; i++)
    		o << m.tvect[i] << endl;		
     
    	return o;
    }
     
    void Matrice::matrand(int n)
    {
    	int i;
     
    	for(i=0; i<line; i++)
    		tvect[i].vectrand(n);	
    }
    Tu peux m'expliquer pourquoi ? Même en regardant attentivement, je vois pas ce qui pose soucis ... j'ai l'impression d'être revenue 1 an en arriere quand j'avais jamais touché au pointeur -_-"
    Et que dit le debugger ? (parce que bon, apprendre à coder, c'est bien, mais apprendre à coder sans apprendre à débugger, ça n'est pas très utile... )
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  9. #9
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 28
    Par défaut
    Je viens d'installer "ddd" (je sais pas trop si c'est ca qu'il fallait que j'installe, mais j'ai trouvé ça dans la faq ^^)

    Et l'erreur qui surviens quand je fait un run est "program received signal sigsegv, segmentation falt

    0xpleinde0400c54 in vector::operator[] (this=0x400950, i=2) at vecteur.cpp

    Si je comprend bien, linux a intérompu le prog parce qu'il a touché un bout de ram lui appartenant pas, jusque la, rien de nouveau.

    mais ça viendrai de ma classe vecteur ? :o

    Je vous montre le code chef !

    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
     
    class Vecteur
    {
    int taille;
    double* value;
     
    Vecteur(int i=1);
    ~Vecteur();
     
    double operator[](int);
     
    };
     
    _______Vecteur.cpp
     
    Vecteur::Vecteur(int n)
    {
    int ;
    taille=n;
    value= new double[n];
     
    for(i)0; i<n; i++)
         value[i]=0:
     
    }
     
     
    Vecteur::~Vecteur()
    {
    delete[] value;
    }
     
    double Vecteur::operator[](int i)
    {
    return value[i];
    }
    Edit:

    Je me demande si ca viens pas plutot de matrice quand même, parce que vecteur, l'affichage etc foncitonne impec; ca viens surement de mon constructeur de matrice ... le voila



    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
     
     
    class Matrice
    {
    int line;
    Vecteur* tvect;
    };
     
     
     
    Matrice::Matrice(int line, int col)
    {
    	int i;
     
    	assert(line>0 && col>0);
     
    	this->line = line;
     
    	Vecteur* tvect = new  Vecteur[line];
     
    	for(i=0; i<line; i++)
    		tvect[i] = Vecteur(col);
    }

  10. #10
    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
    std::vector, c'est une classe, que tu n'as pas codée

    tu peux la remplacer par la tienne, mais le principe reste le meme.

    Pour les templates, je te les ai mis pour indications, parce que ce serait la bonne solution.

    Rappelle toi qu'une classe doit d'abord et avant tout définir les services qu'elle rend.

    La matrice est un tableau de nombre, il faut donc a priori pouvoir en créer une, et la modifier.

    J'ai d'ailleurs omis par mégarde le constructeur par copie (matrice(const matrice&);) et l'opération d'affectation (matrice& operator=(const matrice& m){…; return *this;})

  11. #11
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 305
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 305
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Nous sommes sur un forum d'entraide mais:

    -> Le code que tu fournis ne peux pas compiler (il y a des erreurs de syntaxes) et ne correspond pas à l'erreur dont tu parles (par exemple, dans tes classes, tout est privé, ce qui rend leur utilisation impossible).
    -> Tu ne nous montre pas comment les classes incriminées sont utilisées dans ton code.
    -> Tu ne nous dis pas quelle partie du code génère l'erreur.

    Comment veux-tu que nous puissions t'aider?

    Et effectivement, nous aimerions bien discuter avec ton professeur. Si tu parviens à le convaincre de venir discuter avec nous, je promet de t'aider jusqu'à la fin de ton cours de c++

  12. #12
    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
    J'aime cette promesse

    @Armas:
    Ton problème d'affichage vient directement du fait que rien n'est public dans ta classe matrice.
    Du coup, la fonction libre ostream& operator<<(ostream&, matrice const&) ne peut pas y accéder.

  13. #13
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 28
    Par défaut
    Citation Envoyé par r0d Voir le message
    Bonjour,

    Nous sommes sur un forum d'entraide mais:

    -> Le code que tu fournis ne peux pas compiler (il y a des erreurs de syntaxes) et ne correspond pas à l'erreur dont tu parles (par exemple, dans tes classes, tout est privé, ce qui rend leur utilisation impossible).
    -> Tu ne nous montre pas comment les classes incriminées sont utilisées dans ton code.
    -> Tu ne nous dis pas quelle partie du code génère l'erreur.

    Comment veux-tu que nous puissions t'aider?

    Et effectivement, nous aimerions bien discuter avec ton professeur. Si tu parviens à le convaincre de venir discuter avec nous, je promet de t'aider jusqu'à la fin de ton cours de c++
    Désolé pour le code, j'étais pas sur mon PC donc j'ai tapé de tel sorte que le code soit assez précis pour y voir les erreurs, sans pouvoir le compiler forcément ^^ je le reposte bien du coup

    Pour mon prof, je suis pas sur qu'elle ai le temps x)

    ______________________matrice.hpp
    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
     
    #ifndef __MATRICE__
    #define __MATRICE__
     
    #include <iostream>
    #include "vecteur.hpp"
     
    using namespace std;
     
    class Matrice : public Vecteur
    {
    	int line;
    	Vecteur* tvect;
     
    	public:
     
    	Matrice(int col=1, int line=1);
     
    	void matrand(int n=10);
     
    	Vecteur& operator[](int)const;
    	Matrice& operator=(const Matrice&);
     
    	friend ostream& operator<<(ostream&, Matrice);
    };
     
    #endif
    ______________________matrice.cpp
    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
     
    #include "matrice.hpp"
    #include "vecteur.hpp"
     
    #include <iostream>
    #include <cstdlib>
    #include <assert.h>
     
    using namespace std;
     
    Matrice::Matrice(int line, int col)
    {
    	int i;
     
    	assert(line>0 && col>0);
     
    	this->line = line;
     
    	Vecteur* tvect = new  Vecteur[line];
     
    	for(i=0; i<line; i++)
    		tvect[i] = Vecteur(col);
    }
     
    Vecteur& Matrice::operator[](int i)const
    {
    	return tvect[i];
    }
     
    void Matrice::matrand(int n)
    {
    	int i;
     
    	for(i=0; i<line; i++)
    		tvect[i].vectrand(n);	
    }
     
    Matrice& Matrice::operator=(const Matrice& m)
    {
    	int i;
    	line = m.line;
     
    	delete[] tvect;
     
    	tvect = new Vecteur[line];
     
    	for(i=0; i<line; i++)
    		tvect[i] = m[i];
     
    	return *this;
    }
     
    ostream& operator<<(ostream& o, Matrice m)
    {
    	int i;
     
    	for(i=0; i<m.line; i++)
    		o << m.tvect[i] << endl;		
     
    	return o;
    }

    ____________________vecteur.hpp
    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
    #ifndef __VECTEUR__
    #define __VECTEUR__
     
    #include <iostream>
     
    using namespace std;
     
    class Vecteur
    {
    	int taille;
    	double* value;
     
    	public:
     
    	Vecteur(int=1);
    	Vecteur(const Vecteur&);
     
    	~Vecteur();
     
    	double operator[](int);
    	Vecteur& operator=(const Vecteur&);
    	void vectrand(int n=10);
     
    	friend ostream& operator<<(ostream&, const Vecteur&);
    };
     
    #endif

    ______________vecteur.cpp
    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
    #include "vecteur.hpp"
     
    #include <iostream>
    #include <cstdlib>
     
    using namespace std;
     
     
    Vecteur::Vecteur(int n)
    {
    	int i;
     
    	taille=n;
    	value = new double[n];
     
    	for(i=0; i<n; i++)
    		value[i]=0;
    }
     
     
    Vecteur::Vecteur(const Vecteur& v)
    {
    	int i;
     
    	this->taille = v.taille;
     
    	value = new double[v.taille];
     
    	for(i=0; i<v.taille; i++)
    		value[i]=v.value[i];
    }
     
     
    Vecteur::~Vecteur()
    {
    	delete[] value;
    }
     
    double Vecteur::operator[](int i)
    {
    	return value[i];
    }
     
    Vecteur& Vecteur::operator=(const Vecteur& v)
    {
    	int i;
     
    	delete[] value;
     
    	value = new double[v.taille];
     
    	for(i=0; i<v.taille; i++)
    		value[i]=v.value[i];
     
    	return *this;
    }
     
    ostream& operator<<(ostream& o, const Vecteur& v)
    {	
    	int i;
     
    	for(i=0; i<v.taille; i++)
    		o << v.value[i] << "\t";			
     
    	return o;
    }
     
     
    void Vecteur::vectrand(int n)
    {
    	int i;
     
    	for(i=0; i<taille; i++)
    		value[i]= rand()%n;
    }

  14. #14
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 305
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 305
    Billets dans le blog
    2
    Par défaut
    Il manque l'appel qui fait planter (dans le main certainement). D'ailleurs, autant nous donner le main en entier.

  15. #15
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 305
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 305
    Billets dans le blog
    2
    Par défaut
    Sinon, il y a un problème dans le constructeur de la classe Matrice effectivement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Vecteur* tvect = new  Vecteur[line];
    tvect est déjà déclaré dans la définition de la classe.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tvect = new  Vecteur[line];
    devrait suffire.

  16. #16
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 28
    Par défaut
    Merci beaucoup rod ! j'ai plus de seg fault même si je suis pas sur de comprend pourquoi

    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
    #include <ctime>
    #include <cstdlib>
    #include <iostream>
     
    #include "vecteur.hpp"
    #include "matrice.hpp"
     
    using namespace std;
     
    int main()
    {
    	Matrice m(4, 4);
     
    	srand(time(NULL));
     
    	m.matrand();
     
    	cout << m << endl;
     
    	return 0;
    }
    Néanmoins, ca ne marche toujours pas :'( mon matrand et mon cout ne prennent que la premiere valeur du vecteur, whyyyy ? :'(((

  17. #17
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 305
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 305
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Armas Voir le message
    Merci beaucoup rod ! j'ai plus de seg fault même si je suis pas sur de comprend pourquoi
    Ton code était de ce type (je ne garde que ce qui pose problème):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Matrice
    {
       Vecteur * tvect;
    };
     
    Matrice::Matrice
    {
       Vecteur * tvect = new Vecteur();
    }
    En faisant ça, tu déclares une nouvelle variable tvect, de type Vecteur*. Cette variable est une nouvelle variable locale, ce n'est pas le même tvect qui est déclaré en tant que membre de la classe Matrice. Tu peux voir le problème comme: tu déclares 2 fois la même variable, du coup le compilateur est perdu.

    Il faut bien distinguer, en C++, la déclaration et l'initialisation d'une variable. La déclaration c'est juste tu "dis" au compilateur que cette variable existe. Pour ça, le compilateur a juste besoin de connaître son type. Donc une déclaration c'est juste: int n;
    L'initialisation, c'est lorsque tu affecte une valeur à cette variable: n = 10;
    En c++ on peut faire les deux en même temps: int n = 10; mais ce sont deux choses différentes.

    En vérité, je n'aime pas trop le terme d'initialisation, mais c'est une autre histoire.

  18. #18
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 305
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 305
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Armas Voir le message
    mon matrand et mon cout ne prennent que la premiere valeur du vecteur
    Je ne comprend pas... pourrais-tu être plus explicite?

  19. #19
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 28
    Par défaut
    Merci pour ton explication, c'est bien plus clair maintenant


    Quand je declare un vecteur dans mon main, que je fait un vectrand et un cout du vecteur, il m'affiche, par exemple pour un vecteur(5) :

    1 23 8 76 67

    5 nombres espacés par une tabulation.

    Pour une matrice, je fais pareil : Je prend chaque Vecteur de la matrice, je lui fait faire un vectrand. pareil pour cout : cout << matrice == cout << chaque vecteur de la matrice.

    Or la, il me fait un "semi" vectrand sur seulement la premier colone de la matrice (donc premier element de chaque vecteur). Pareil pour l'affichage, je vois pas trop pourquoi

  20. #20
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 305
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 305
    Billets dans le blog
    2
    Par défaut
    pour matrand, je ne vois pas où est le problème. Mais pour le cout, je te donnes 2 indices:
    1. compares l'operateur << du vecteur et celui de la matrice, et identifie les différences entre les deux.
    2. renseignes-toi sur ce qu'est le "passage de paramètre par référence" et le "passage de paramètre par valeur".

Discussions similaires

  1. Réponses: 10
    Dernier message: 05/12/2005, 01h25
  2. [C++] pointeur sur une classe
    Par PH69 dans le forum Débuter
    Réponses: 1
    Dernier message: 21/11/2005, 22h08
  3. Création dynamique de méthode sur une classe ?
    Par elitost dans le forum Général Java
    Réponses: 9
    Dernier message: 18/10/2005, 14h47
  4. Réponses: 14
    Dernier message: 14/03/2005, 09h16
  5. [MFC] Problème pointeur sur une classe
    Par mick74 dans le forum MFC
    Réponses: 7
    Dernier message: 14/04/2004, 14h17

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