Multiplication matrices de tailles inconnues
airstrik
Messages postés
4
Statut
Membre
-
Hxyp Messages postés 401 Date d'inscription Statut Membre Dernière intervention -
Hxyp Messages postés 401 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Voila je sais déja faire une multiplication de matrice en C. Mon probleme c que je dois multiplier des matrices dont les tailles varient au fur et a mesure du programme et le compilateur refuse ca.
Par exemple si je définis une fonction du genre:
max = 4000;
Void Prodmat(double A[][], int nla, int nca, double B[][], int nlb, int ncb, double C[max][max])
Aprés débogage je reçois des erreurs. (Error: invalid use of array with unspecified bounds)
Ou si j'essaye aussi
Void Prodmat(double A[max][max], double B[max][max], double C[max][max], int nla, int nca, int nlb, int ncb)
La dans le programme principale si je prends par exemple A[4][5] j'obtiens une erreur du genre impossible de convertir double [*][4000] en double[*][5].
Je ne sais plus ou donner la tête. PS: need help et c urgent
Voila je sais déja faire une multiplication de matrice en C. Mon probleme c que je dois multiplier des matrices dont les tailles varient au fur et a mesure du programme et le compilateur refuse ca.
Par exemple si je définis une fonction du genre:
max = 4000;
Void Prodmat(double A[][], int nla, int nca, double B[][], int nlb, int ncb, double C[max][max])
Aprés débogage je reçois des erreurs. (Error: invalid use of array with unspecified bounds)
Ou si j'essaye aussi
Void Prodmat(double A[max][max], double B[max][max], double C[max][max], int nla, int nca, int nlb, int ncb)
La dans le programme principale si je prends par exemple A[4][5] j'obtiens une erreur du genre impossible de convertir double [*][4000] en double[*][5].
Je ne sais plus ou donner la tête. PS: need help et c urgent
A voir également:
- Multiplication matrices de tailles inconnues
- Application multiplication - Télécharger - Études & Formations
- Comment retrouver la taille normale de l'écran iphone ✓ - Forum iPhone
- Comment retrouver la taille normale de mon écran? ✓ - Forum Ecran
- Tableau taux de marge et coefficient multiplicateur ✓ - Forum Excel
- Dans le document à télécharger, formatez le texte comme ceci : appliquez une taille de 11 pt à tous les textes sans gras ni italique appliquez une taille de 14 pt à tous les textes en italique après ce formatage, combien de pages le document contient-il ? ✓ - Forum Bureautique
1 réponse
Bonjour,
En utilisant des pointeurs ça peut être plus simple, exemple :
N'oubliez pas de faire le free qui va avec allocm
Une autre idée qui simplifierait encore serait d'utiliser une structure par matrice et éviterait d'avoir à préciser leur taille en paramètre des fonctions :
n'ai pas fais le free là non plus
En utilisant des pointeurs ça peut être plus simple, exemple :
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
void prodmat(double **A,int ya,int xa,double **B,int yb,int xb){
int i,j;
printf("A :\n");
for(i=0;i<ya;i++){
for(j=0;j<xa;j++)
printf("%f ",A[i][j]);
printf("\n");
}
printf("B :\n");
for(i=0;i<yb;i++){
for(j=0;j<xb;j++)
printf("%f ",B[i][j]);
printf("\n");
}
}
double **allocm(int y,int x){
double **ptr; int i;
ptr=malloc(sizeof(double*)*y);
if(ptr){
for(i=0;i<y;i++){
ptr[i]=malloc(sizeof(double)*x);
assert(ptr[i]);
}
}
return ptr;
}
void addstuff(double **ptr,int y,int x){
int i,j,c=1;
for(i=0;i<y;i++)
for(j=0;j<x;j++){
ptr[i][j]=c;
c++;
}
}
int main(void)
{
double **A,**B;
A=allocm(4,5);
B=allocm(3,2);
addstuff(A,4,5);
addstuff(B,3,2);
prodmat(A,4,5,B,3,2);
return 0;
}
N'oubliez pas de faire le free qui va avec allocm
Une autre idée qui simplifierait encore serait d'utiliser une structure par matrice et éviterait d'avoir à préciser leur taille en paramètre des fonctions :
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef struct{
double **m;
int y,x;
}matx;
void prodmat(matx *mA,matx *mB){
int i,j;
printf("A :\n");
for(i=0;i<mA->y;i++){
for(j=0;j<mA->x;j++)
printf("%f ",mA->m[i][j]);
printf("\n");
}
printf("B :\n");
for(i=0;i<mB->y;i++){
for(j=0;j<mB->x;j++)
printf("%f ",mB->m[i][j]);
printf("\n");
}
}
matx *allocm(int y,int x){
matx *ptr; int i;
ptr=malloc(sizeof(matx));
assert(ptr);
ptr->y=y,ptr->x=x;
ptr->m=malloc(sizeof(double*)*ptr->y);
assert(ptr->m);
for(i=0;i<ptr->y;i++){
ptr->m[i]=malloc(sizeof(double)*ptr->x);
assert(ptr->m[i]);
}
return ptr;
}
void addstuff(matx *m){
int i,j,c=1;
for(i=0;i<m->y;i++)
for(j=0;j<m->x;j++){
m->m[i][j]=c;
c++;
}
}
int main(void)
{
matx *mA,*mB;
mA=allocm(4,5);
mB=allocm(3,2);
addstuff(mA);
addstuff(mB);
prodmat(mA,mB);
return 0;
}
n'ai pas fais le free là non plus