Comportement C++ etrange

Char Snipeur -  
BigSeb Messages postés 614 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,
le code suivant me sort des resultats etrange : 2×3=9 !!!
j'utilise les fonctions operator. Et je compile sous DEVCPP 4.0
En fait le premier produit de matriX2 se fait bien, mais pas forcement le suivant selon les variables multiplier.
Si qqun a le courage de regarder, je le remercie.

#include <vector.h>
#include <stdio.h>
//#include <d:\Profiles\LAMOME-JUL\mesdoc~1\prog\proj_These\matrix.h>
struct MATRIX2
{
int n;
vector<double> M;
MATRIX2() {};
MATRIX2(int a)
{
n=a;
for (int i=0;i<n*n;i++)
M.push_back(0);
};
~MATRIX2(){M.~vector<double>();};
double& operator()(int x,int y)
{
//vector<double>::iterator iter;iter=M.begin()+x+n*y;
return M[x+n*y];
}
MATRIX2& operator=(MATRIX2& S)
{
//for (int i=0;i<n*n;i++)
M=S.M;
return *this;
}
void affiche()
{
for (int i=0;i<n;i++)
{
printf("| ");
for (int j=0;j<n;j++)
printf("%.0f | ",M[i+n*j]);
printf("\n");
}
}
};
MATRIX2& operator+(MATRIX2 A,double B)
{
MATRIX2 *tmp;
tmp=new MATRIX2;
for (int i=0;i<A.M.size();i++)
tmp->M.push_back(A.M[i]+B);
return *tmp;
}
MATRIX2& operator*(MATRIX2 A,double B)
{
MATRIX2 *tmp;
tmp=new MATRIX2;
for (int i=0;i<A.M.size();i++)
tmp->M.push_back(A.M[i]*B);
return *tmp;
}
MATRIX2& operator+(MATRIX2 A,MATRIX2 B)
{
MATRIX2 *tmp;
tmp=new MATRIX2;
for (int i=0;i<A.M.size();i++)
tmp->M.push_back(A.M[i]+B.M[i]);
return *tmp;
}
MATRIX2& operator-(MATRIX2 A,MATRIX2 B)
{
MATRIX2 *tmp;
tmp=new MATRIX2;
for (int i=0;i<A.M.size();i++)
tmp->M.push_back(A.M[i]-B.M[i]);
return *tmp;
}
MATRIX2& operator*(MATRIX2 A,MATRIX2 B)
{
MATRIX2 *tmp;
tmp=new MATRIX2 (0);
double a;
for (int i=0;i<A.n;i++)
{
a=A.M[i]*B.M[i];
tmp->M.push_back(a);
}
return *tmp;
}
int n=2;
int main()
{
MATRIX2 A(n),C(n),D(n),E(n);
//MATRIX2 C(n);
A(1,0)=2.0;
C(1,0)=3.0;
//D=A*A;
E=C*A;
D=E*A;
double a=A(1,0);
double e=E(1,0);
double c=C(1,0);
double d=D(1,0);
printf("A\n");
A.affiche();
printf("C\n");
C.affiche();
printf("D\n");
D.affiche();
printf("E\n");
E.affiche();
printf("\n");
printf("%f %f %f %f %f\n",a,c,d,e,(A*C)(1,0));
system("PAUSE");
return 0;
}

6 réponses

blurk Messages postés 486 Date d'inscription   Statut Membre Dernière intervention   160
 
Salut!

J'ai pas eu le temps de tester, mais
Le constructeur par défaut ne fait rien, or tu crée des instances *tmp de MATRIX2, et il n'y a pas de "new[]". Ce qui veut dire qu'il y a des variables dont le contenu n'est pas initialisé, donc valeur aléatoire, et je me demande même si il n'y aurait pas des problèmes d'allocation mémoire si tu réitère trop. En effet, si tu déclare *variable sans faire d'allocation...
bon courage!
0
char snipeur
 
Ok, merci beaucoup, je voi un peu mieu d'ou peu provenir l'erreur.
Et en effet, il m'arrive de temps en temps d'avoir des violation d'acces.
Mais normalement, on peut avoir un constructeur qui ne fait rien, car on peu initialiser un vecteur vide.
l'instruction push_back permet de le remplir au fur et à mesure sans avoir à déclarer sa taille. Mais il est possible que je n'ai pas très bien compris...
0
char snipeur
 
j'ai trouver la solution : il faut rajouter des '&' :
MATRIX2& operator*(MATRIX2& A,MATRIX2& B)
{
MATRIX2 *tmp;
tmp=new MATRIX2 (0);
double a;
for (int i=0;i<A.n;i++)
{
a=A.M[i]*B.M[i];
tmp->M.push_back(a);
}
return *tmp;
}

par contre si qqun pouvais m'expliquer le pourquoi du comment...
0
BigSeb Messages postés 614 Date d'inscription   Statut Contributeur Dernière intervention   12
 
L'utilisation du & en c++ est utilisé pour faire dezs passage par reference. Voila le pourquoi du comment.

-°-_-°-_-°-_-°-_-°-_-°-
On the road again !!!!!!!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
En effet, ça je le sais, mais je comprend pas bien la différence avec '*' !
MATRIX* A, et MATRIX& A : deux passage par référence, et pourtant 2 opérateur unaire différent !

Salutation !
Char Snipeur
0
BigSeb Messages postés 614 Date d'inscription   Statut Contributeur Dernière intervention   12
 
* passage par adresse
& passage par reference

-°-_-°-_-°-_-°-_-°-_-°-
On the road again !!!!!!!
0