Pb de l'operateur = en c++
pom
-
pom -
pom -
Bonjour, je me suis codé une classe Matrice qui marche très bien : je l'ai blindée de jeu de tests. Je suis en train de me coder une classe de solver de systeme linéaire pour résoudre Ax=b mais j'ai un problème au niveau du constructeur. Voici ma classe :
#include "matrice.h"
class Solv
{
Matrice _A;
Matrice _b; // c'est en fait un vecteur colonne mais je n'ai pas fait de classe Vecteur
public :
Solv(const Matrice & A, const Matrice & b) {_A=A;_b=b;}
};
et j'ai un fameux segmentation fault. Pourtant l'operateur = de ma classe matrice est ok
Quelqu'un peut-il m'aider s'il vous plait ? Grands mercis.
pom
#include "matrice.h"
class Solv
{
Matrice _A;
Matrice _b; // c'est en fait un vecteur colonne mais je n'ai pas fait de classe Vecteur
public :
Solv(const Matrice & A, const Matrice & b) {_A=A;_b=b;}
};
et j'ai un fameux segmentation fault. Pourtant l'operateur = de ma classe matrice est ok
Quelqu'un peut-il m'aider s'il vous plait ? Grands mercis.
pom
A voir également:
- Pb de l'operateur = en c++
- Opérateur de réseau mobile - Guide
- 0466 quel opérateur - Forum Mobile
- 0668 quel opérateur ✓ - Forum Mobile
- 0758 quel opérateur - Forum Opérateurs & Réseaux mobiles
- 0650 quel opérateur - Forum Mobile
3 réponses
Bonjour ou Bonsoir,
Je ne vois pas ton erreur.
Peut etre pourrais tu mettre ton code de la classe matrice pour que ca nous aide, ainsi que ton main.
Bon courage.
++
JSS
Je ne vois pas ton erreur.
Peut etre pourrais tu mettre ton code de la classe matrice pour que ca nous aide, ainsi que ton main.
Bon courage.
++
JSS
Bonjour, j'ai ma réponse. Je vais te la dire, peut etre que ca pourra aider un jour une autre personne.
J'avais un constructeur par défaut de ma classe Matrice qui était
Matrice::Matrice() {nb_ligne=0; nb_col=0;}
Donc au moment ou j'appelais mon Solv il y avait un pb de dimension et le pointeur de ma classe Matrice pointait sur rien du tout.
class Solv
{
Matrice _A;
Matrice _b; // c'est en fait un vecteur colonne mais je n'ai pas fait de classe Vecteur
public :
Solv(const Matrice & A, const Matrice & b) {_A=A;_b=b;}
};
La réponse est :
class Solv
{
Matrice _A;
Matrice _b;
public :
Solv(const Matrice & A, const Matrice & b): _A(A), _b(b) {}
};
Ainsi, avant d'entrer dans le corps du constructeur, j'initialise les matrices _A et _b à l'aide du constructeur par copie de ma classe Matrice
Merci de t'etre penché sur mon pb.
pom
J'avais un constructeur par défaut de ma classe Matrice qui était
Matrice::Matrice() {nb_ligne=0; nb_col=0;}
Donc au moment ou j'appelais mon Solv il y avait un pb de dimension et le pointeur de ma classe Matrice pointait sur rien du tout.
class Solv
{
Matrice _A;
Matrice _b; // c'est en fait un vecteur colonne mais je n'ai pas fait de classe Vecteur
public :
Solv(const Matrice & A, const Matrice & b) {_A=A;_b=b;}
};
La réponse est :
class Solv
{
Matrice _A;
Matrice _b;
public :
Solv(const Matrice & A, const Matrice & b): _A(A), _b(b) {}
};
Ainsi, avant d'entrer dans le corps du constructeur, j'initialise les matrices _A et _b à l'aide du constructeur par copie de ma classe Matrice
Merci de t'etre penché sur mon pb.
pom
Salut Pom,
ce que tu décris me fait penser que
1) ton constructeur de copie est OK
2) ton opérateur = ne fonctionne pas correctement pour les matrices. L'as tu surchargé ? Ta classe matrice contient surement des données dynmamiques (pointeurs)
Envoies nous le code complet ici et je t'indiquerai le pb.
marvinroue
ce que tu décris me fait penser que
1) ton constructeur de copie est OK
2) ton opérateur = ne fonctionne pas correctement pour les matrices. L'as tu surchargé ? Ta classe matrice contient surement des données dynmamiques (pointeurs)
Envoies nous le code complet ici et je t'indiquerai le pb.
marvinroue
Salut Marvinroue, merci de te pencher sur mon pb.
J'ai trouvé la solution (enfin plutot un ami me la dite). Mon erreur provenait du fait qu'il fallait que j'appelle mes constructeur AVANT d'entrer dans le corps du constructeur de Solv (pb d'initialisation). Pour plus de détails j'ai mis la correction (en espérant qu'elle puisse un jour servir à qqun) juste avant ta réponse.
J'ai l'impression que tu t'y connais au moins un minimum en c++. J'ai un autre pb (et je suis sur que ce doit etre un pb de constructeur). J'ai besoin de faire un vecteur de Matrice. Soit je template ma classe et au quel cas ca doit marcher (mais j'ai pas envoie pour l'instant car ca m'oblige à remodiifier tout mon prgm), soit j'utilise un vector<Matrice>. C'est ce que j'ai fait (connais-tu une 3e soluition ?) Mon pb est que j'ai un segmentation fault à la fin.
Voici mon main :
#include<iostream>
#include "matrice.h"
#include <vector.h>
using std::cout;
using std::endl;
int main()
{
vector<Matrice> v(3);
for(int i=0;i<3;i++) {cout<<"i= "<<i<<endl; v[i]=identite(3);} // la matrice identite 3*3
cout<<endl;
cout<<v[0]<<v[1]<<v[2]<<endl;
return 0;
}
Il y tout qui marche, tout s'affiche sauf que j'ai un segmentation fault apres l'affichage de v. D'ou cela peut provenir.
Voici mon constructeur par defaut et mon operateur =
Matrice() {l=1; c=1; m[0]=0.;}
Matrice& Matrice::operator=(const Matrice& mat) // operateur =
{
if(this==&mat) return *this; // pour eviter de faire mat=mat
l=mat.l; // nb ligne
c=mat.c; // nb colonne
ulong cl=c*l; //ulong pour unsigned long
// les trois lignes suivantes permettent de faire A=B ou A et B n'ont pas les memes dimensions. Ainsi les dimensions de A sont modifiees !
delete [] m;
m=0; // evite d'avoir un pointeur fou
m=new double[cl]; // on cree de la place dans le tas
for(ulong i=0;i<cl;i++)
m[i]=mat.m[i];
return *this;
}
Si tu peux trouver l'origine de ce seg fault ce serait vraiment cool. Merci encore.
Pom
J'ai trouvé la solution (enfin plutot un ami me la dite). Mon erreur provenait du fait qu'il fallait que j'appelle mes constructeur AVANT d'entrer dans le corps du constructeur de Solv (pb d'initialisation). Pour plus de détails j'ai mis la correction (en espérant qu'elle puisse un jour servir à qqun) juste avant ta réponse.
J'ai l'impression que tu t'y connais au moins un minimum en c++. J'ai un autre pb (et je suis sur que ce doit etre un pb de constructeur). J'ai besoin de faire un vecteur de Matrice. Soit je template ma classe et au quel cas ca doit marcher (mais j'ai pas envoie pour l'instant car ca m'oblige à remodiifier tout mon prgm), soit j'utilise un vector<Matrice>. C'est ce que j'ai fait (connais-tu une 3e soluition ?) Mon pb est que j'ai un segmentation fault à la fin.
Voici mon main :
#include<iostream>
#include "matrice.h"
#include <vector.h>
using std::cout;
using std::endl;
int main()
{
vector<Matrice> v(3);
for(int i=0;i<3;i++) {cout<<"i= "<<i<<endl; v[i]=identite(3);} // la matrice identite 3*3
cout<<endl;
cout<<v[0]<<v[1]<<v[2]<<endl;
return 0;
}
Il y tout qui marche, tout s'affiche sauf que j'ai un segmentation fault apres l'affichage de v. D'ou cela peut provenir.
Voici mon constructeur par defaut et mon operateur =
Matrice() {l=1; c=1; m[0]=0.;}
Matrice& Matrice::operator=(const Matrice& mat) // operateur =
{
if(this==&mat) return *this; // pour eviter de faire mat=mat
l=mat.l; // nb ligne
c=mat.c; // nb colonne
ulong cl=c*l; //ulong pour unsigned long
// les trois lignes suivantes permettent de faire A=B ou A et B n'ont pas les memes dimensions. Ainsi les dimensions de A sont modifiees !
delete [] m;
m=0; // evite d'avoir un pointeur fou
m=new double[cl]; // on cree de la place dans le tas
for(ulong i=0;i<cl;i++)
m[i]=mat.m[i];
return *this;
}
Si tu peux trouver l'origine de ce seg fault ce serait vraiment cool. Merci encore.
Pom