C : Allocation Dynamique de matrices

Fermé
fabienlele Messages postés 4 Date d'inscription vendredi 26 décembre 2008 Statut Membre Dernière intervention 27 décembre 2008 - 26 déc. 2008 à 21:53
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 29 déc. 2008 à 17:23
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
27 déc. 2008 à 11:29
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