Produit matriciel en c
Résolu
guitoontruant
Messages postés
316
Statut
Membre
-
fiddy Messages postés 441 Date d'inscription Statut Contributeur Dernière intervention -
fiddy Messages postés 441 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
j'ai:
#include <stdio.h>
double prodmat(double A[100][100], double B[100][100], int nla, int nca, int ncb, int nlb)
{
double C[100][100];
int i,j,k;
for (i=0;i<=nla;i++)
{
for (j=0;j<=ncb;j++)
{
C[i][j]=0;
for (k=0;k<nca;k++)
{
C[i][j]+=A[i][k]*B[k][j];
}
}
}
return (C);
}
Le compilateur me renvoit un incompatible types in return, je pense que ça vient du fait que le double C eest donnée avec des lignes et des colonnes mais pas prodmat. Comment résoudre ce problème?
Merci d'avance
j'ai:
#include <stdio.h>
double prodmat(double A[100][100], double B[100][100], int nla, int nca, int ncb, int nlb)
{
double C[100][100];
int i,j,k;
for (i=0;i<=nla;i++)
{
for (j=0;j<=ncb;j++)
{
C[i][j]=0;
for (k=0;k<nca;k++)
{
C[i][j]+=A[i][k]*B[k][j];
}
}
}
return (C);
}
Le compilateur me renvoit un incompatible types in return, je pense que ça vient du fait que le double C eest donnée avec des lignes et des colonnes mais pas prodmat. Comment résoudre ce problème?
Merci d'avance
Configuration: Windows XP Firefox 2.0.0.9
10 réponses
-
Salut,
Quand tu déclares une variable tableau dans une fonction comme ceci
double d[100];
L'espace alloué à ce tableau n'est utilisable que dans cette fonction.
En fait il faut passer ta variable en paramètre de la fonction:
void prodmat(double A[100][100], double B[100][100], double C[100][100], int nla, int nca, int ncb, int nlb) { double C[100][100]; int i,j,k; for (i=0;i<=nla;i++) { for (j=0;j<=ncb;j++) { C[i][j]=0; for (k=0;k<nca;k++) { C[i][j]+=A[i][k]*B[k][j]; } } } }
Tu déclares ton C dans la fonction qui appele prodmat, puis tu appele prodmat avec:
double C[100][100];
prodmat(A, B, C, etc...);
Pi voila... -
je fais mes intruction int i,j,k;
for (i=0;i<=nlA;i++)
{
for (j=0;j<=ncB;j++)
{
C[i][j]=0;
for (k=0;k<ncA;k++)
{
C[i][j]+=A[i][k]*B[k][j];
}
ET LE PRODUIT DONNE ZERO EN UNE SEUULE LIGNE -
-
-
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
-
OK merci pour cette explication claire et précise
-
Le problème c'est qu'avec cette correction vu que C est une recopie, au niveau de la fonction qui appelle prodmat, la matrice C ne contiendra pas le résultat du produit matriciel. Il faudrait soit la passer par un pointeur, soit par une référence.
Ci-dessous une version template du produit matriciel pour une matrice de taille quelconque.
http://www.commentcamarche.net/forum/affich 1907231 produit matriciel en c
Bonne chance -
J'ai du mal à comprendre ce que tu veux dire.
C sera passé comme un pointeur comme s'il s'agissait d'un C déclaré ainsi:
double **C;
Non? Je me fourvoie peut être, mais je crois vraiment que C est passé par adresse et non pas par copie avec ma correction. -
Bonjour,
mamiemando
Le problème c'est qu'avec cette correction vu que C est une recopie, au niveau de la fonction qui appelle prodmat, la matrice C ne contiendra pas le résultat du produit matriciel. Il faudrait soit la passer par un pointeur, soit par une référence.
La correction de kilian est bonne, c'est bien un pointeur qu'il envoie et non une recopie.
Dans prod mat(double A[100][100], double B[100][100], double C[100][100], ...),
double C[100][100] pourrait aussi s'écrire double C[][100] ou double (*C)[100]. Il s'agit bel et bien d'un pointeur.
Par exemple, tab[i] est synonyme de *(tab+i), ou encore de i[tab], certe spécial lol.
kilian, dans ton code, tu as redéfini double C[100][100] qui est déjà dans les arguments.
D'autre part, il est tout à fait possible de renvoyer un pointeur sur une variable locale d'une fonction à condition de la mettre en static.
Cdt -
Tout à fait je me suis trompée. Je n'utilise jamais la syntaxe avec [ ] mais c'est bien le pointeur qui est passé. Merci pour cette précision et pour ta vigilance.