C : Allocation Dynamique de matrices

fabienlele Messages postés 4 Date d'inscription   Statut Membre Dernière intervention   -  
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Je cherche à créer une procédure qui demande à l'utilisateur la dimension de 2 matrices puis les déclare pour ensuite demander à l'utilisateur de les remplir.
Quand je lance l'exe, la console me demande la dimension des matrices et là c'est le drame.
Je pense que le problème est dans l'allocation dynamique ou bien dans une mauvaise utilisation des pointeurs : vous verrez, c'est très étoilé comme programme ! =]
Merci beaucoup pour toute proposition.

#include ...
Déclarations...

int main()
{
int i,j,k,n,selection;
double **mat1,**mat2;

// Initialisation des matrices //
saisie (&mat1,&mat2,&n);
printf("Voici la matrice 1 :\n\n");afficher(mat1,n);printf("Voici la matrice 2 :\n\n");afficher(mat2,n);

// On libère la mémoire utilisée par les matrices //
for (k=0; k<n; k++) if(mat1[k] != NULL) free(mat1[k]);
if (mat1 != NULL) free(mat1);

for (k=0; k<n; k++) if(mat2[k] != NULL) free(mat2[k]);
if (mat2 != NULL) free(mat2);

}


void afficher(double **A,int m)
{
int j,k;
for (j=0;j<m;j++)
{
for (k=0;k<m;k++) printf("%lg ",A[j][k]);
printf("\n");
}
printf("\n\n");
}



void saisie (double * **A,double * **B,int *m)
{
int i,j,k;

// Dimension des matrices //
printf("Dimension n = ");scanf("%d",m);

//On réserve A//
*A = (double**)calloc(*m, sizeof(double*));
if (*A == NULL)
{
printf("\n Allocation dynamique IMPOSSIBLE pour A");
getch( );
}
for (k=0; k< *m ; k++)
{
*A[k] = (double*)calloc(*m,sizeof(double));
if (*A[k] == NULL)
{
printf("\n Allocation dynamique IMPOSSIBLE pour A[%d]",k);
getch( );
}
}

//On réserve B//
*B = (double**)calloc(*m, sizeof(double*));
if (*B == NULL)
{
printf("\n Allocation dynamique IMPOSSIBLE pour B");
getch( );
}
for (k=0; k< *m ; k++)
{
*B[k] = (double*)calloc(*m,sizeof(double));
if (*B[k] == NULL)
{
printf("\n Allocation dynamique IMPOSSIBLE pour B[%d]",k);
getch( );
}
}

// Remplissage des matrices //
printf("Matrice A:\n");
for (i=0;i<*m;i++)
{
for (j=0;j<*m;j++) printf("A[%d][%d] = ",i,j);scanf("%lf",&A[i][j]);printf("\n");
}

printf("Matrice B:\n");
for (i=0;i<*m;i++)
{
for (j=0;j<*m;j++) printf("B[%d][%d] = ",i,j);scanf("%lf",&B[i][j]);printf("\n");
}
}

4 réponses

fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Salut,
Bon dans ce cas, la syntaxe va s'allourdir. ^^.
Je t'ai changé plusieurs petites choses (comme enlever les getch, etc).
Si t'as des questions, n'hésite pas.
#include <stdio.h>
#include <stdlib.h>

void afficher(double**,int);
void saisie(double***,double***,int*);

int main(void) { 
    int i;
    int n; 
    double **mat1,**mat2; 

    // Initialisation des matrices
    saisie (&mat1,&mat2,&n); 
    printf("Voici la matrice 1 :\n\n");
    afficher(mat1,n);

    printf("Voici la matrice 2 :\n\n");
    afficher(mat2,n); 

    // On libère la mémoire utilisée par les matrices
    for(i=0; i<n; i++) {
        if(mat1[i] != NULL) free(mat1[i]);
        if(mat2[i] != NULL) free(mat2[i]);
    }

    if (mat1 != NULL) free(mat1); 
    if (mat2 != NULL) free(mat2); 

    return 0;
} 


void afficher(double **A,int n) { 
    int j,k;
    for (j=0;j<n;j++) { 
        for (k=0;k<n;k++) printf("%lf ",A[j][k]);
        printf("\n");
    }

    printf("\n\n"); 
} 



void saisie (double * **A,double * **B,int *m) { 
    int i,j,k; 

    // Dimension des matrices 
    printf("Dimension n = ");fflush(stdout);
    scanf("%d",m);
    while(getchar()!='\n');

    //On réserve A
    *A = malloc(*m *sizeof **A); 
    if (*A == NULL) 
    { 
        printf("\n Allocation dynamique IMPOSSIBLE pour A\n");
        exit(EXIT_FAILURE);
        
    }

    for (k=0; k< *m ; k++) 
    { 
        (*A)[k] = malloc(*m * sizeof ***A);
        if ((*A)[k] == NULL) 
        { 
            printf("\n Allocation dynamique IMPOSSIBLE pour A[%d]\n",k); 
            exit(EXIT_FAILURE);
        } 
    } 

    //On réserve B
    *B = malloc(*m * sizeof **B); 
    if (*B == NULL)
    { 
        printf("\n Allocation dynamique IMPOSSIBLE pour B\n"); 
        exit(EXIT_FAILURE);
    }

    for (k=0; k< *m ; k++) 
    { 
        (*B)[k] = malloc(*m * sizeof ***B); 
        if ((*B)[k] == NULL)
        { 
            printf("\n Allocation dynamique IMPOSSIBLE pour B[%d]\n",k); 
            exit(EXIT_FAILURE);
        } 
    } 

    // Remplissage des matrices // printf("Matrice A:\n"); 
    for (i=0;i<*m;i++) 
        for (j=0;j<*m;j++) {
            printf("A[%d][%d] = ",i,j);fflush(stdout);
            scanf("%lf",&(*A)[i][j]);printf("\n");
        }


    printf("Matrice B:\n"); 
    for (i=0;i<*m;i++) 
        for (j=0;j<*m;j++) {
            printf("B[%d][%d] = ",i,j);fflush(stdout);
            scanf("%lf",&(*B)[i][j]);
            printf("\n");
        }
}

1