[C++] Matrices, pointeurs et fonctions...

Tzeentch -  
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
A voir également:

5 réponses

superCC Messages postés 50 Date d'inscription   Statut Membre Dernière intervention   3
 
http://www.courses.psu.edu/aersp/aersp309_r81/cpp/matmul_help.html
0
Tzeentch
 
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
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
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)
0
Tzeentch
 
Oui... je me doutais pour la double étoile...
Mais pourquoi appeler la fonction sans utiliser les "&" alors?
et au moment du calcul que dois-je écrire?

J'ai beau réviser sans cesse, les pointeurs et moi ca fait 36 :(

Merci quand meme.
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
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.
0
superCC Messages postés 50 Date d'inscription   Statut Membre Dernière intervention   3
 
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
0

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

Posez votre question
superCC Messages postés 50 Date d'inscription   Statut Membre Dernière intervention   3
 
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!
0