compilation mai au lancement "erreur la memoire ne peu pas pas etre read"

Signaler
Messages postés
9
Date d'inscription
vendredi 23 décembre 2005
Statut
Membre
Dernière intervention
30 décembre 2005
-
Messages postés
9
Date d'inscription
vendredi 23 décembre 2005
Statut
Membre
Dernière intervention
30 décembre 2005
-
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");
}
}


main()
{
struct matrice M1;
creation(M1);
affichage(M1);
system("pause");
}

7 réponses

Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
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 ...



Bon aller cyao.
Messages postés
75
Date d'inscription
mardi 9 septembre 2003
Statut
Membre
Dernière intervention
14 janvier 2009
31
Il y a un pb avec ta structure. Le code ci dessous marche. Mais essay quand même de comprendre !!



// tester sous linux.



#include<stdio.h>

#include<stdlib.h>



typedef struct {

int dim1;

int dim2;

int type;

double **tab;

}matrice;



void creation (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;jtab[j]</gras>);


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(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");

}

}



int main()

{

matrice M1;

creation(&M1);

affichage(M1);

system("pause");

return 0;

}
Messages postés
700
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
4
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)

a+
Messages postés
700
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
4
bon ben on t'a tous répondu en meme temps
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Effectivement, et en plus pour dire la meme chose. :)
Messages postés
1787
Date d'inscription
lundi 22 novembre 2004
Statut
Membre
Dernière intervention
31 janvier 2009
2
Tu dois passer par un pointeur sur ta structure ;)

Oups :)

Trop tard !

Lol
if(!Meilleur("Joky")) return ERREUR;<
Messages postés
9
Date d'inscription
vendredi 23 décembre 2005
Statut
Membre
Dernière intervention
30 décembre 2005

merci de vos réponses si rapides. je vai essayer de comprendre maintenant