Comportement C++ etrange
Char Snipeur
-
BigSeb Messages postés 614 Date d'inscription Statut Contributeur Dernière intervention -
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;
}
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;
}
A voir également:
- Comportement C++ etrange
- Reponse a une demande d'explication pour mauvais comportement - Forum Réseaux sociaux
- Nous suspectons un comportement automatisé sur votre compte instagram - Forum Windows
- Nous suspectons un comportement automatisé - Forum Loisirs / Divertissements
- Pourquoi ce blocage ? quelque chose dans le comportement du navigateur nous a intrigué. - Forum Google Chrome
- Disque dur au comportement étrange - Forum Disque dur / SSD
6 réponses
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!
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!
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...
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...
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...
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...
L'utilisation du & en c++ est utilisé pour faire dezs passage par reference. Voila le pourquoi du comment.
-°-_-°-_-°-_-°-_-°-_-°-
On the road again !!!!!!!
-°-_-°-_-°-_-°-_-°-_-°-
On the road again !!!!!!!
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question