Produit matriciel en c

Résolu
guitoontruant Messages postés 315 Date d'inscription   Statut Membre Dernière intervention   -  
fiddy Messages postés 11069 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

10 réponses

kilian Messages postés 8732 Date d'inscription   Statut Modérateur Dernière intervention   1 526
 
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   Statut Membre Dernière intervention  
 
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   Statut Contributeur Dernière intervention   1 846
 
Bonjour ?
Et merci d'ouvrir un post. Celui la remonte et ça sera plus simple.
0
mathéo
 
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
leSurvivant
 
Sans convictions certaines, je mettrais :
return(C[ ][ ]);
0
leSurvivant
 
h oui c'est exact bien vu kilian!
0

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

Posez votre question
leSurvivant
 
ah oui c'est exact bien vu kilian!
0
guitoontruant Messages postés 315 Date d'inscription   Statut Membre Dernière intervention   53
 
OK merci pour cette explication claire et précise
0
mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
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 8732 Date d'inscription   Statut Modérateur Dernière intervention   1 526
 
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   Statut Contributeur Dernière intervention   1 846
 
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 33772 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
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