C : Allocation Dynamique de matrices
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");
}
}
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");
}
}
Configuration: Windows XP Firefox 2.0.0.20
4 réponses
-
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?-
ContributeurRe,
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
-