C : Allocation Dynamique de matrices [Fermé]

Signaler
Messages postés
4
Date d'inscription
vendredi 26 décembre 2008
Statut
Membre
Dernière intervention
27 décembre 2008
-
fiddy
Messages postés
11137
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
-
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

Messages postés
11137
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 649
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 86849 internautes nous ont dit merci ce mois-ci

Messages postés
11137
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 649
Salut,
Ton code est bien compliqué.
Usuellement, on alloue les matrices avant de les passer en arguments, en plus ça te permettra d'avoir les malloc avec les free :). Et ça te simplifiera la vie ;)
Si ça ne marche toujours pas, poste ton nouveau code et n'oublie pas stp de le mettre entre des balises code (trois cases à droite du bouton gras). Ca permet de garder l'indentation :)
Bonne chance
Messages postés
4
Date d'inscription
vendredi 26 décembre 2008
Statut
Membre
Dernière intervention
27 décembre 2008

L'exo est le suivant :

"Ajouter une fonction saisie qui permet de donner au clavier la dimension des 2 matrices et de les remplir. Les arguments de cette fonction (void) seront A, B et l'adresse de n".
Le problème c'est que je ne peux pas mettre les calloc en dehors de la fonction saisie car j'ai besoin de déterminer n avant de faire la réservation dynamique.
Je vous mets le programme dans des balises :

#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"); 
} 
}
Messages postés
4
Date d'inscription
vendredi 26 décembre 2008
Statut
Membre
Dernière intervention
27 décembre 2008

Merci fiddy pour ta proposition mais... ton programme ne se compile pas !
Ca coince aux niveaux de tes malloc et comme je n'ai jamais utilisé les malloc (j'utilise les calloc) je ne peux pas te corriger.
Est-ce que les fflush sont indispensables?
fiddy
Messages postés
11137
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 649
Re,
Sur ma machine, ça compile parfaitement. Quel message d'erreurs obtiens-tu ?
T'as bien fait un copier coller de mon code ?

Tu peux mettre des calloc si tu veux. Mais c'est dommage de faire du calloc (qui initialise tout à 0), et de faire du scanf derrière pour récrire sur les 0.
Les fflush(stdout); sont là pour forcer l'affichage puisqu'il n'y a pas de '\n' dans le buffer ou d'autre condition provoquant le flush automatique. Si tu les enlèves, étant donné que c'est un scanf qu'il y a derrière, cela ne changera probablement rien sur ta machine, mais cela ne sera pas portable.

Cdlt