compilation mai au lancement "erreur la memoire ne peu pas pas etre read"
touny23
Messages postés9Date d'inscriptionvendredi 23 décembre 2005StatutMembreDernière intervention30 décembre 2005
-
23 déc. 2005 à 10:44
touny23
Messages postés9Date d'inscriptionvendredi 23 décembre 2005StatutMembreDernière intervention30 décembre 2005
-
23 déc. 2005 à 15:31
je maitrise pas tro le C.mai comme j ai un projet a faire dessus pour la rentré , je sui obligé de m y mettre .
j arrive a compiler sous dev-cpp mai lors de l execution j ai cette erreur qui apparait :
L'instruction à "0*0040148a" emploie l adresse mémoire "0*00000000".La mémoire ne peut pas etre"read".
cliquez sur OK pour terminer le programme.
cliquez sur Annuler pour déboguer le programme
je sai pas d ou ça vien
je vous envoie le programme : si vous pouviez m aider ça m arrnagerai enormement ...sinon j essaierai sous unix a la rentrée ...merci d avance
#include<stdio.h>
#include<stdlib.h>
struct matrice {
int dim1;
int dim2;
int type;
double **tab;
};
void creation (struct matrice M)
{
int i,j;
printf("creation d'une matrice!!!!\n");
printf("entrer la 1e dimension=");
scanf("%d",&M.dim1);
printf("entrer la 2e dimension=");
scanf("%d",&M.dim2);
printf("entrer le type de la matrice=\n");
printf("1-matrice pleine\n");
printf("2-matrice triangulaire inférieure\n");
printf("3-matrice triangulaire supérieure\n");
scanf("%d",&M.type);
if(M.type==1){
M.tab=(double **)malloc(M.dim1*sizeof(double *));
if(M.tab==NULL)printf("echec allocation mémoire\n");
for(i=0;i<M.dim1;i++)
{
M.tab[i]=(double *)malloc(M.dim2*sizeof(double));
if(M.tab[i]==NULL)
{for(j=0;j<i;j++){
free(M.tab[j]);
printf("echec allocation mémoire\n");
}
}
}
printf("chiffre de la matrice??");
for(i=0;i<M.dim2;i++){
printf("%d e ligne\n",i);
for(j=0;j<M.dim1;j++)scanf("%lf",&M.tab[i][j]);
}
}
}
void affichage(struct matrice M)
{
int i,j;
for(i=0;i<M.dim2;i++){
for(j=0;j<M.dim1;j++){printf("%lf",M.tab[i][j]);}
printf("\n");
}
}
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 juillet 20086 23 déc. 2005 à 11:23
Tu te mélanges les pinceaux avec le passage d'argument. Tu oublies
qu'un argument n'est qu'une copie de l'objet initial. Donc si tu
modifies la copie, ca change rien à l'objet initial. Donc quand tu fais
affichage(M1). Tu affiches une matrice qui n'est pas encore initialisée.
Faut faire des passages par référence, (avec & si tu fais du C++, ou par pointeur, si tu fais de C).
Bon mais ca doit pas etre la seule erreur, mais essai de mieux le présenter, la c'est pénible à déchiffrer.
Tu vois ce genre de chose est étrange:
if(M.tab==NULL)
printf("echec allocation mémoire\n");
for(i=0;i<M.dim1;i++)
{
M.tab[i]=(double *)malloc(M.dim2*sizeof(double));
...
Ya une erreur d'allocation, mais tu vas quand meme allouer tous les éléments de la matrice ...
cosmobob
Messages postés700Date d'inscriptionmardi 30 décembre 2003StatutMembreDernière intervention27 janvier 20094 23 déc. 2005 à 11:25
salut,
tu dois passer ta structure matrice par un pointeur.
void creation (struct matrice* M)
{
// remplacer M. par M->
}
dans ton main:
main()
{
struct matrice M1;
creation(&M1);
affichage(M1);
system("pause");
}
en C, tu ne peux pas modifier un objet que tu passes par valeur dans un procedure.
Si tu veux le modifier, tu dois le passer par adresse (avec un pointeur)