[C++] Matrices, pointeurs et fonctions...
Tzeentch
-
Char Snipeur Messages postés 9813 Date d'inscription Statut Contributeur Dernière intervention -
Char Snipeur Messages postés 9813 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
Je me replonge dans le C++ et les pointeurs car j'aurais besoin de programmer (entre autres...) une fonction qui calcule un produit de matrices. Je me suis replongé dans ce forum et dans les WikiLivres mais je n'ai pas réussi à forger un code sans erreur.
Dans mon programme principal, j'ai déclaré 3 matrices de dimensions fixes:
exemple:
double A[3][3], double B[3][3], double X[3][3];
Imaginons que je veuille faire le produit X=A*B
Comme j'en ai plusieurs de la sorte et que je ne connais pas les classes je voulais appeler une fonction en passant des pointeurs comme paramètres.
L'avantage étant que la fonction manipule directement les bonnes variables.
J'ai essayé quelquechose du genre:
Int main
{
double A[3][3], double B[3][3], double X[3][3];
//ici j'ai initialisé les valeurs de la matrice X à 0 avec une boucle
//ici j'ai défini les valeurs de A et de B
//ici j'appelle la fonction produit selon le schéma que je pensais être bon en tout cas pour des variables double normales
produit(&A,&B,&X);
//je m'attends à avoir dans X le résultat
}
void produit (double *pA[3][3], double *pB[3][3], double *pX[3][3]) //je définis des pointeurs dans la fonction
{
int i,j,k;
//ici je calcule le produit des matrices en utilisant le déréférencement des pointeurs pour manipuler les variables
for (i=0,i<3,i++)
{
for (j=0,j<3,j++)
{
for (k=0,k<3,k++)
{
*pX[i][j]=(*pA[i][k])*(*pB[k][j])+*pX[i][j]
}
}
}
}
Evidemment ce n'est pas bon mais que dois-je faire?
Merci d'avance pour votre aide.
Tzeentch
Je me replonge dans le C++ et les pointeurs car j'aurais besoin de programmer (entre autres...) une fonction qui calcule un produit de matrices. Je me suis replongé dans ce forum et dans les WikiLivres mais je n'ai pas réussi à forger un code sans erreur.
Dans mon programme principal, j'ai déclaré 3 matrices de dimensions fixes:
exemple:
double A[3][3], double B[3][3], double X[3][3];
Imaginons que je veuille faire le produit X=A*B
Comme j'en ai plusieurs de la sorte et que je ne connais pas les classes je voulais appeler une fonction en passant des pointeurs comme paramètres.
L'avantage étant que la fonction manipule directement les bonnes variables.
J'ai essayé quelquechose du genre:
Int main
{
double A[3][3], double B[3][3], double X[3][3];
//ici j'ai initialisé les valeurs de la matrice X à 0 avec une boucle
//ici j'ai défini les valeurs de A et de B
//ici j'appelle la fonction produit selon le schéma que je pensais être bon en tout cas pour des variables double normales
produit(&A,&B,&X);
//je m'attends à avoir dans X le résultat
}
void produit (double *pA[3][3], double *pB[3][3], double *pX[3][3]) //je définis des pointeurs dans la fonction
{
int i,j,k;
//ici je calcule le produit des matrices en utilisant le déréférencement des pointeurs pour manipuler les variables
for (i=0,i<3,i++)
{
for (j=0,j<3,j++)
{
for (k=0,k<3,k++)
{
*pX[i][j]=(*pA[i][k])*(*pB[k][j])+*pX[i][j]
}
}
}
}
Evidemment ce n'est pas bon mais que dois-je faire?
Merci d'avance pour votre aide.
Tzeentch
A voir également:
- [C++] Matrices, pointeurs et fonctions...
- Fonction si et - Guide
- Codes secrets Android : accéder aux fonctions cachées - Guide
- Fonctions excel en anglais - Guide
- Fonctions excel - Guide
- Fonction rechercher et remplacer word - Guide
5 réponses
Oui, oui mais ca c'est le produit des matrices. ça je sais faire, ce n'est pas le problème ^^
Je ne l'ai écrit que pour montrer l'opérateur de déréférencement. C'est pour le reste que ca m'interesse :D
Je ne l'ai écrit que pour montrer l'opérateur de déréférencement. C'est pour le reste que ca m'interesse :D
Houlà !
déjà révise tes pointeurs et tableaux.
Comme on me l'a déjà fait remarqué sur le forum, tableau et pointeurs, c'est différent. Mais, en gros, un double A[][] correspond à un double** B.(un Type A[]; est très proche d'un Type* const B; pour être plus précis)
essai plutôt :
void produit (double** A,double** B,double **X);
et appel la fonction : produit(A,B,C)
déjà révise tes pointeurs et tableaux.
Comme on me l'a déjà fait remarqué sur le forum, tableau et pointeurs, c'est différent. Mais, en gros, un double A[][] correspond à un double** B.(un Type A[]; est très proche d'un Type* const B; pour être plus précis)
essai plutôt :
void produit (double** A,double** B,double **X);
et appel la fonction : produit(A,B,C)
Prenons le cas plus simple d'un vecteur.
double A[3],B[3],X[3];
void produit (double* Af,double* Bf,double *Xf);
produit(A,B,C)
A est équivalent à un double * c'est à dire que *A==A[0], *(A+1)==A[1];
lors de l'appel de la fonction, tu passe l'adresse A à la variable Af de type double*. C'est comme si tu fesait double *Af=A;
Si tu fait une sorti console, tu as A=x001, et Af=x001, donc lorsque tu modifie les valeur pointé par Af, tu modifie les valeurs pointés par A.
En revanche si dans la fonction produit tu fait Af=\x002, et qu'en suite tu fait Af[0]=3, tu ne modifie plus A[0] et A vaut toujours \x001 !
Donc un simple passage de A à produit suffit, pas besoin de passer l'adresse de A.
Il faut voir qu'en C ce n'est jamais la variable qui est passé en paramètre d'une fonction, mais une copie. Dans le cas d'un double, c'est une copie de la valeur, dans le cas d'un double* c'est la copie de l'adresse.
double A[3],B[3],X[3];
void produit (double* Af,double* Bf,double *Xf);
produit(A,B,C)
A est équivalent à un double * c'est à dire que *A==A[0], *(A+1)==A[1];
lors de l'appel de la fonction, tu passe l'adresse A à la variable Af de type double*. C'est comme si tu fesait double *Af=A;
Si tu fait une sorti console, tu as A=x001, et Af=x001, donc lorsque tu modifie les valeur pointé par Af, tu modifie les valeurs pointés par A.
En revanche si dans la fonction produit tu fait Af=\x002, et qu'en suite tu fait Af[0]=3, tu ne modifie plus A[0] et A vaut toujours \x001 !
Donc un simple passage de A à produit suffit, pas besoin de passer l'adresse de A.
Il faut voir qu'en C ce n'est jamais la variable qui est passé en paramètre d'une fonction, mais une copie. Dans le cas d'un double, c'est une copie de la valeur, dans le cas d'un double* c'est la copie de l'adresse.
Effectivement, tu ne peux pas définir ta fonction ainsi. Tu ne définis pas la grosseur de tes matrices en paramètre! Tu passes seulement les pointeurs en param et tu dois instancier par la suite
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Salut!
Bon je vais essayer de t'aider un peu mieux. J'ai trouvé la réponse à ta question dans ce tutoriel :
http://www.cplusplus.com/doc/tutorial/pointers/
Bonne lecture!
Bon je vais essayer de t'aider un peu mieux. J'ai trouvé la réponse à ta question dans ce tutoriel :
http://www.cplusplus.com/doc/tutorial/pointers/
Bonne lecture!