Rechercher : dans
Par :

Produit matriciel en c

Dernière réponse le 27 fév 2008 à 13:41:17 guitoontruant, le 9 nov 2007 à 12:21:58 
 Signaler ce message aux modérateurs

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

Configuration: Windows XP
Firefox 2.0.0.9

Meilleures réponses pour « Produit matriciel en c » dans :
La compilation et les modules en C et en C++ VoirCet article a pour vocation d'introduire les notions de bases de la compilation en C et en C++ et de la programmation modulaire. Il permet de mieux comprendre les messages d'erreur du compilateur. Les notions abordées ici sont indépendantes du...
3D Secure / Verified by Visa / SecureCode: Qu'est-ce que c'est ? VoirDepuis octobre 2008, les banques et commerçants en ligne ont commencé à adopter le système 3DSecure pour les paiements sur Internet. Qu'est-ce que c'est ? 3DSecure est appelé "Verified by Visa" chez Visa, et "SecureCode" chez Mastercard. (Les logos...
[Langage C] C/C++ Erreur de segmentation VoirQu'est ce qu'une erreur de segmentation Vous êtes en train de développer une application sous Linux en C/C++. Tout va bien, ça compile, les oiseaux chantent. Donc vous lancez votre application pour la tester. Et vous obtenez l'un de ces deux...
Télécharger Visual C++ Express VoirVisual C++ Express est une version "gratuite" et allégée de Visual Studio ; l'utilisation requiert l'inscription sur le site de Microsoft. Cet environnement de développement permet de créer des application Win32 ou du .NET C.
Langage C++ - Les types de données VoirLes types de données Les données manipulées en langage C++, comme en langage C, sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître...
Les chaînes de caractères en C++ VoirQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C++, une...
Langage C - Les types de données VoirLes types de données Les données manipulées en langage C sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître l'occupation mémoire (le...

1

leSurvivant, le 9 nov 2007 à 12:45:08

Sans convictions certaines, je mettrais :
return(C[ ][ ]);

Répondre à leSurvivant

2

kilian, le 9 nov 2007 à 12:54:55
  • +2

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...

Répondre à kilian

3

leSurvivant, le 9 nov 2007 à 12:59:34

H oui c'est exact bien vu kilian!

Répondre à leSurvivant

4

leSurvivant, le 9 nov 2007 à 13:02:39

Ah oui c'est exact bien vu kilian!

Répondre à leSurvivant

5

guitoontruant, le 9 nov 2007 à 13:02:48

OK merci pour cette explication claire et précise

Répondre à guitoontruant

6

mamiemando, le 9 nov 2007 à 21:26:16

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

Répondre à mamiemando

7

kilian, le 10 nov 2007 à 00:28:09

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.

Répondre à kilian

8

fiddy, le 10 nov 2007 à 01:10: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
Google is your friend

Répondre à fiddy

9

mamiemando, le 10 nov 2007 à 03:25:58

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.

Répondre à mamiemando

10

 mathéo, le 27 fév 2008 à 13:41:17

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

Répondre à mathéo
Collection CommentÇaMarche.net