multiplication de matrices

multiplication de matrices - C - Programmation

Marsh Posté le 28-04-2005 à 14:08:15    

Encore moi ! Bon là pour vous cela doit etre simple à résoudre mais moi je suis trop dedans à mon avis .  
Voila je multiplie des matrices selon les règles normales , mais à l'affichage ... rien je suis bloqué le code est bon sans erreur d'allocation ..  
 
  voila un bout du code  
 
void produit(int N,int M,float **a,float **b,float **c)
{
int i,j;
 
c=(float **)malloc((N)*sizeof(float *));
 
for (i=0 ; i<N ; i++)
 {
 c[i]=(float *)malloc((M)*sizeof(float));    
 }
 
for (i=0 ; i<N ;i++)
{ printf("i=%d",i);
 for (j=0 ; i<M;j++)
 {
 c[i][j]=a[i][j]*b[j][i];
 printf("%f",c[i][j]);
 
 }
}
 
}
 
void affiche(float **c,int N,int M)
{
int i,j;
printf(" \n voici le produit de matrice \n " );
for (i=0 ; i<N ; i++)
 { printf("i=%d",i);
  for(j=0;j<M;j++)
    { printf("j=%d",j);
      printf("%f",c[i][j]);
    }
 }
 
}
 
int main()
{
int *N,*M;
float **a,**b,**c;
saisie(N,M,a,b);
produit(*N,*M,a,b,c);
affiche(c,*N,*M);
 
 return(0);
}
 
Si vous voyez l'erreur merci de me le signaler ..  
 
Pour rappelle je debute 4 seance de C dc ...

Reply

Marsh Posté le 28-04-2005 à 14:08:15   

Reply

Marsh Posté le 28-04-2005 à 14:09:29    

les printf suplementaire c'était pour vérifier mais ils n apparaissent pas à l'écran

Reply

Marsh Posté le 28-04-2005 à 14:29:40    

c=(float **)malloc((N)*sizeof(float *));  
->
c = malloc( N * sizeof *c ); plus sur
 
alloue un buffer (NxM) et pas une collection de buffer
 
pourquoi
int *N,*M; ?

Reply

Marsh Posté le 28-04-2005 à 14:40:57    

Problème de passage de paramètre par variable, que ce soit pour saisie() comme pour produit().
 
Pour passer un paramètre par variable, il faut donner son adresse.
 
Exemple :
 
 
 
 
float **c;
produit(N,M,a,b, &c);
 
 
Avec produit() :
void produit(int N, int M, float **a, float **b, float ***c);
 
 
J'imagine, vu le code, que ce sera pareil pour saisie().
 
 
De même, déclare N et M comme des int normaux, et passe leur adresse plutôt, ce sera plus propre :
 
int N, M;
saisie(&N, &M, &a, &b);


Message édité par Elmoricq le 28-04-2005 à 15:05:13
Reply

Marsh Posté le 28-04-2005 à 14:53:37    

c'est du passage par valeur, ca n'existe pas le passage par reference en c

Reply

Marsh Posté le 28-04-2005 à 15:02:43    

oui je vois bien ce que vous voulez dire mais en fait dans le programme tout passe nikel juste il n'entre dans aucune boucle ni pour le calcul de C[i] ni pour son affichage.
N et M sont des pointeurs car dans la premiere fonction (que vous ne voyez pas )on demande à l'utilisateur d'entrer la taille ligne colonne de la matrice.
Ainsi en utilisant un addressage à l'zide de pointeur N et M ne sont plus intern à la fonction . Dans les deux autres je n'ai pas besoin de les modifier ..

Reply

Marsh Posté le 28-04-2005 à 15:04:17    

Et pour le malloc c'est equivalent au calloc non ?

Reply

Marsh Posté le 28-04-2005 à 15:04:39    

skelter a écrit :

c'est du passage par valeur, ca n'existe pas le passage par reference en c


 
Ce n'est effectivement pas du passage par référence, qui n'existe pas dans le C mais dans le C++, et qui est un poil différent.
Abus de langage de ma part.
 
Je me permets de corriger ma réponse précédente pour ne plus refléter cette erreur.  :jap:

Reply

Marsh Posté le 28-04-2005 à 15:08:32    

d'jo a écrit :

oui je vois bien ce que vous voulez dire mais en fait dans le programme tout passe nikel juste il n'entre dans aucune boucle ni pour le calcul de C[i] ni pour son affichage.
N et M sont des pointeurs car dans la premiere fonction (que vous ne voyez pas )on demande à l'utilisateur d'entrer la taille ligne colonne de la matrice.
Ainsi en utilisant un addressage à l'zide de pointeur N et M ne sont plus intern à la fonction . Dans les deux autres je n'ai pas besoin de les modifier ..


 
Tu as lu ce que j'ai écrit ?
 
Car de ce que je vois de ton code, ni a, ni b, ni c ne sont jamais initialisés dans main()
 
Les allocations sont sans doute correctes dans les fonctions saisie() ou produit() (quoi que pour saisie() on ne peut pas vérifier), mais main() ne reçoit jamais le contenu de ces variables.
 
De même que pour N et M, je pense que tu n'as pas compris le concept.
 
Pour t'aider :  
http://c.developpez.com/tutcpp/x1659.php


Message édité par Elmoricq le 28-04-2005 à 15:09:53
Reply

Marsh Posté le 28-04-2005 à 15:25:05    

ok !!
il faut tout initialiser dans le main alors

Reply

Marsh Posté le 28-04-2005 à 15:25:05   

Reply

Marsh Posté le 28-04-2005 à 15:26:25    

oui oui en effet je n'ai pas tout compris encore je débute avec les pointeurs et le C d'ailleur

Reply

Marsh Posté le 28-04-2005 à 15:29:40    

Alors vas consulter le lien que j'ai mis, tu en découvriras plus sur le passage par valeur et par variable.
 
Et, non, il ne faut pas tout initialiser dans le main.
Sur le lien que j'ai indiqué, c'est marqué ce que fait la fonction quand elle reçoit une variable : elle recopie la valeur, même si la variable s'appelle pareil, c'est pas la même entre main() et la fonction appelée.
 
Pour avoir la MEME variable, il faut donner son adresse mémoire à la fonction, ce qui se fait avec "&".

Reply

Marsh Posté le 28-04-2005 à 15:43:32    

ok merci j'ai vu le site il explique bien (toi aussi t'inquiete pas  !) le fonctionnement général. Par contre pour utiliser le malloc j'avoue que j'ai encore du mal mais ça va venir

Reply

Marsh Posté le 28-04-2005 à 16:03:16    

d'jo a écrit :

voila un bout du code


Ta maman, elle t'a jamais dit qu'il fallait déclarer avant d'utiliser ? Mauvaise mère...


main.c: In function `produit':
 
main.c:17: warning: implicit declaration of function `malloc'
main.c:17: warning: nested extern declaration of `malloc'
<internal>:0: warning: redundant redeclaration of 'malloc'
main.c:25: warning: implicit declaration of function `printf'
main.c:25: warning: nested extern declaration of `printf'
 
<internal>:0: warning: redundant redeclaration of 'printf'
 
main.c: In function `affiche':
 
main.c:39: warning: nested extern declaration of `printf'
<internal>:0: warning: redundant redeclaration of 'printf'
main.c: At top level:
main.c:51: warning: function declaration isn't a prototype
main.c: In function `main_':
main.c:54: warning: implicit declaration of function `saisie'
main.c:54: warning: nested extern declaration of `saisie'
 
main.c:52: warning: 'N' might be used uninitialized in this function
 
main.c:52: warning: 'M' might be used uninitialized in this function
main.c:53: warning: 'a' might be used uninitialized in this function
main.c:53: warning: 'b' might be used uninitialized in this function
 
gcc.exe out/main.o out/frmwrk.o  -o "out\ed01.exe" -L"D:/DEV-CPP/lib" -L"d:/clib/ed/devcpp/lib" -led  
 
out/main.o:main.c:(.text+0x149): undefined reference to `saisie'


 
Et les balises code <fixed>, <cpp>, c'est en option ?


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 28-04-2005 à 16:19:03    

RERE je débute et c'est pas ma maman mais un prof assez spécial qui m'apprend!!je connais pas tes balises je suis en C et enfin quand j'execute le programme en entier j'ai AUCUN probleme ??!!  
Voiloo non mais c'est vrai que j'ai quand meme du mal.lol enfin bon 4 td c'est un peu chaud .
J'aimerai également fabriquer une matrice  
 
 a b c d....z
 b c d .....a
 c
 .
 .
 z          a
 
Si quelqu'un à une idée ?
Je pensais utiliser un pointeur de pointeur mais comme je vous le disais c'est encor tres flou dans ma tete !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed