Multiplication matrices de tailles inconnues

Fermé
airstrik Messages postés 4 Date d'inscription jeudi 8 mars 2012 Statut Membre Dernière intervention 6 avril 2012 - Modifié par airstrik le 6/04/2012 à 13:43
Hxyp Messages postés 401 Date d'inscription vendredi 28 janvier 2011 Statut Membre Dernière intervention 27 avril 2014 - 8 avril 2012 à 00:28
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



1 réponse

Hxyp Messages postés 401 Date d'inscription vendredi 28 janvier 2011 Statut Membre Dernière intervention 27 avril 2014 54
8 avril 2012 à 00:28
Bonjour,
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
0