Produit matriciel en c

Résolu/Fermé
guitoontruant Messages postés 315 Date d'inscription dimanche 7 janvier 2007 Statut Membre Dernière intervention 26 août 2011 - 9 nov. 2007 à 12:21
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 8 mars 2012 à 12:44
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

10 réponses

kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
9 nov. 2007 à 12:54
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...
3
airstrik Messages postés 4 Date d'inscription jeudi 8 mars 2012 Statut Membre Dernière intervention 6 avril 2012
8 mars 2012 à 11:10
jai éssayé ton code ca me renvoit error: 'C' redeclared as different kind of symbol.

Mais si je commente le double C[100][100] de prodmat ca marche mais ca me retourne des valeurs nulles pour la matrice C quelque soit i et j
Ps g besoin d'un code qui marche merci d'avance
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
8 mars 2012 à 12:44
Bonjour ?
Et merci d'ouvrir un post. Celui la remonte et ça sera plus simple.
0
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
1
Sans convictions certaines, je mettrais :
return(C[ ][ ]);
0
h oui c'est exact bien vu kilian!
0

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

Posez votre question
ah oui c'est exact bien vu kilian!
0
guitoontruant Messages postés 315 Date d'inscription dimanche 7 janvier 2007 Statut Membre Dernière intervention 26 août 2011 53
9 nov. 2007 à 13:02
OK merci pour cette explication claire et précise
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
9 nov. 2007 à 21:26
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
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
10 nov. 2007 à 00:28
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.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
10 nov. 2007 à 01:10
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
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
10 nov. 2007 à 03:25
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.
0