Répétition d'allocation, désallocation de mémoire sur des matrices

BouiB1 Messages postés 9 Date d'inscription samedi 8 mai 2004 Statut Membre Dernière intervention 14 novembre 2005 - 8 nov. 2005 à 16:13
BouiB1 Messages postés 9 Date d'inscription samedi 8 mai 2004 Statut Membre Dernière intervention 14 novembre 2005 - 14 nov. 2005 à 16:43
Bonjour a tous !

pour mes cours j'ai besoin de faire un petit programme de résolution de
systèmes linéaires. Le problème n'est pas dans l'lgorithme de calcul
comme vous pouvez le lire dans le titre mais plus dans la gestiond e la
mémoire. En effet, le programme lit des matrices dans un fichier texte
et ajuste la taille de la matrice en fonction des besoins (le rang de
la matrice est indiqué dans le fichier). Une fois fini on lance le
calcul et on affiche le résultat. L'utilisateur peut alors décider de
lire une nouvelle matrice dans le fichier (elle peut être plus grande
ou plus petite). Et c'est justement à partir de la que ça ce complique.
Mon programme ressemble à ça (ce n'est qu'une structure ne faites pas attention a la syntaxe car c'est tout sauf du c ^^) :



lire taille matrice <---,

allouer_matrice |

lire données |

calcul
|

afficher données |

désallouer matrice |

recommencer ? ---'



void allouer_matrice(int nb_lignes, int nb_colonnes, matrice mat_p)

{

mat_p=realloc(mat_p,(nb_lignes+1)*sizeof(vecteur));

if (mat_p == NULL)

{

printf("\n /!\\ Manque d'espace memoire mat col\n");

getch();

exit(1);

}

for(i=1;i<=nb_lignes;i++)

{

mat_p[i]=realloc(mat_p[i],nb_colonnes*sizeof(double));

if (mat_p)[i] == NULL)

{

printf("\n /!\\ Manque d'espace memoire mat lignes %d\n",i);

getch();

exit(1);

}

}

}



void free_mat(int nb_lignes, matrice mat_p)

{

for(i=1;i<=nb_lignes;i++)

{

free(mat_p[i]);

mat_p[i]=NULL;

}

free(mat_p);

}

8 réponses

DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
8 nov. 2005 à 16:37
Ou est le problème ?
Tu as des plantages ? Des erreurs de compilations ?

Donne plus d'info...

Shell
0
BouiB1 Messages postés 9 Date d'inscription samedi 8 mai 2004 Statut Membre Dernière intervention 14 novembre 2005
8 nov. 2005 à 16:42
autant pour moi ! ca compile pas mais j'arrive pas à allouer plusieurs fois de suite la même matrice et le programme fini par planter. du style : "l'instruction à "0x7c94426d" emploie l'adresse mémoire "0x00000000". La mémoire ne peut pas être "read". " ou bien j'arrive a exécuter sur plusieurs exemples et puis sur un exemple le programme quitte sans message d'erreur.
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
8 nov. 2005 à 17:07
Lorsque tu fais un free(mat_p) tu detruit ta variable.
Elle pointe donc nullpart, c'est pourquoi tu ne peut pas alloué ensuite.

Met cette ligne en commentaire et testes.

Shell
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
8 nov. 2005 à 17:15
En fait le free_mat(...) ne doit etre appeller qu'a la fin du programme.
A chaque fois que tu veux gerer une nouvelle matrice, appelle directement allouer_matrice(...), sans passer par free_met(...).

realloc(...), réalloue une zone mémoire comme sont nom l'indique.
Cette fonction redimenssione donc ta variable en conséquence, qu'elle soit plus petite ou plus grande.
Si ta variable vaut null, alors realloc appelle malloc, sinon la réallocation se fait sur le tas.

Shell
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BouiB1 Messages postés 9 Date d'inscription samedi 8 mai 2004 Statut Membre Dernière intervention 14 novembre 2005
8 nov. 2005 à 17:37
merci ça précise ma pensée ! donc avec ce changement je peut allouer la meme matrice autant de fois que je veux mais quand je change d'exemple ... parfois je me retrouve avec le même type d'erreurs

en fait j'ai régler le problème qui était sur l'allocation des vecteurs : je suis obliger d'allouer nb_lignes+1 sinon ca plante ...

merci beaucoup shell ! j'y voit un peu plus clair maintenant
0
BouiB1 Messages postés 9 Date d'inscription samedi 8 mai 2004 Statut Membre Dernière intervention 14 novembre 2005
9 nov. 2005 à 18:50
et c'est pas fini ^^

en fait j'ai pas de soucis en allouant une matrice et deux vecteurs.

Dans un second alogorithme j'ai plus de variable a allouer : trois
matrices et trois vecteurs dans cet ordre : matrice, vecteur, matrice,
matrice et les deux autres vecteurs. ca plante justement lors de
l'allocation des deux derniers vecteurs. si je change l'ordre
d'allocation (par exemple les deux derniers vcteurs avant les matrices)
c'est sur les matrices que ca plante (message d'erreur du style la
mémoire ne peut être lue blabla). je veu bien a nouveau un petit coup
de main :-D merci d'avance !
0
BouiB1 Messages postés 9 Date d'inscription samedi 8 mai 2004 Statut Membre Dernière intervention 14 novembre 2005
14 nov. 2005 à 16:13
Et bien je chercher mais sans trouver. J'ai beau alloué dans tous les
sens et il y a rien à y faire dev-c++ compile exécute mais au bout de
quelques allocations ca plante. Si quel'qu'un veu bien me donner un
dernier coup de pouce ce serait tres sympa. Merci d'avance.
0
BouiB1 Messages postés 9 Date d'inscription samedi 8 mai 2004 Statut Membre Dernière intervention 14 novembre 2005
14 nov. 2005 à 16:43
pour pouvoir trouver l'erreur j'ai fait un programme simplifié qui alloue a répétition des matrices :



#include <stdio.h>

#include <math.h>

#include <conio.h>

#include <stdlib.h>

#include <ctype.h>

#include <string.h>

#include <stdlib.h>



typedef double *vecteur;

typedef vecteur *matrice;



void allouer_matrice(int nb_lignes, int nb_colonnes, matrice *A);

void allouer_vecteur(int nb_lignes, int nb_colonnes, vecteur *V);



int main(void)

{

int i;

matrice A,B,C,D,E,F,G;

vecteur H,I,J,K,L;

for(i=0;i<=100;i++)

{

printf("\niteration %d :",i);

allouer_matrice(20,20,&A);

printf("mA ");

allouer_matrice(20,20,&B);

printf("mB ");

allouer_matrice(20,20,&C);

printf("mC ");

allouer_vecteur(20,0,&H);

printf("vH ");

allouer_vecteur(20,0,&I);

printf("vI ");

allouer_matrice(20,20,&D);

printf("mD ");

allouer_matrice(20,20,&E);

printf("mE ");

allouer_vecteur(20,0,&J);

printf("vJ ");

allouer_vecteur(20,0,&K);

printf("vK ");

allouer_vecteur(20,0,&L);

printf("vL ");

allouer_matrice(20,20,&G);

printf("mG ");

}

getch();

}



void allouer_matrice(int nb_lignes, int nb_colonnes, matrice *A)

{

int i;



*A=malloc(nb_lignes*sizeof(vecteur));

if (*A == NULL)

{

printf("\n /!\\ Manque d'espace memoire mat col\n");

getch();

exit(1);

}

for(i=1;i<=nb_lignes;i++)

{

(*A)[i]=malloc(nb_colonnes*sizeof(double));

if ((*A)[i] == NULL)

{

printf("\n /!\\ Manque d'espace memoire mat lignes %d\n",i);

getch();

exit(1);

}

}

}



void allouer_vecteur(int nb_lignes, int nb_colonnes, vecteur *V)

{

int i;

*V=malloc((nb_lignes+1)*sizeof(double));

if (*V == NULL)

{

printf("\n /!\\ Manque d'espace memoire vect\n");

getch();

exit(1);

}

}
0
Rejoignez-nous