Comportement C++ etrange

Fermé
Char Snipeur - 21 avril 2004 à 15:06
BigSeb Messages postés 614 Date d'inscription vendredi 16 avril 2004 Statut Contributeur Dernière intervention 22 juillet 2005 - 26 avril 2004 à 09:21
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 vendredi 16 avril 2004 Statut Membre Dernière intervention 15 mars 2009 160
21 avril 2004 à 16:28
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
22 avril 2004 à 09:15
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
22 avril 2004 à 15:09
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 vendredi 16 avril 2004 Statut Contributeur Dernière intervention 22 juillet 2005 12
22 avril 2004 à 15:24
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 9688 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 2 octobre 2020 1 328
26 avril 2004 à 09:10
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 vendredi 16 avril 2004 Statut Contributeur Dernière intervention 22 juillet 2005 12
26 avril 2004 à 09:21
* passage par adresse
& passage par reference

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