Problème allocation en Langage C

Résolu/Fermé
Kelm - 13 nov. 2011 à 12:11
 Kelm - 13 nov. 2011 à 14:50
Bonjour,
Je remercie tout d'abord tout ceux qui peuvent donner un peut de temps à mon problème .
Voici le problème :
je lis un fichier txt tel que je stock les informations dans une structure, mon problème est que je ne sais pas comment je peux récupérer ma structure dans le main en sachant que je ne veux pas la retourner dans ma fonction read ?
Quand j'utilise le code ci dessus je rencontre des problèmes au niveau d'allocation .

Voici un exemple du code que j' utilise.
La structure "var" je veux l'appeler dans mon main .

typedef struct ma_struct{
int a;
int b;
char c;
}ma_struct_t;
typedef ma_struc_t * struct_pt; /*Pointeur sur la structure*/

void read_file(struct_pt * var)
{
int i;
/*var est un tableau de pointeur sur la structure struct_pt*/
FILE *f;
if((f=fopen("fichier.txt","r")==NULL) printf("erreur");
var=realloc(var,sizeof(struct_pt)*N_MAX); /*N_MAX est lu du fichier aussi*/

for(i=0;i<N_MAX;++i)
{
var[i]=(struct_pt)malloc(sizeof(ma_struct_t));
fscanf(f,"%d %d %c",var[i]->a,var[i]->b,var[i]->c);
}
}

int main()
{
struct_pt *var=NULL ;
read_file(var);
/*J'ai des problème d'allocation */
return 0;
}
A voir également:

2 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 840
Modifié par fiddy le 13/11/2011 à 14:05
Bonjour,
Pas mal de points à revoir :
if((f=fopen("fichier.txt","r")==NULL) printf("erreur");
Il faut mettre des parenthèses autour de f=fopen(...) vu que l'opérateur == est plus prioritaire que l'opérateur =.
Sinon f contiendra un int au lieu d'un FILE*. D'ailleurs, le compilateur devrait couiner.

De plus, tu as oublié le fclose(f);

Ensuite, tu as un simple pointeur sur un var. Tu fais l'allocation comme si tu avais un tableau (donc dimension double).
Et enfin, lorsque tu alloues dans une autre fonction, il faut envoyer un pointeur sur le tout pour ne pas perdre le résultat de l'allocation.
Au final, il te faut, struct_pt ***var=NULL;

Le prototype de ta fonction deviendra : void read_file(struct_pt *** var)

Et tu remplaceras dans la fonction read_file, les occurrences de var par (*var)

Et n'oublie pas les free.

Cdlt,

Google is your friend
0
Merci pour votre réponse en effet je n'avais pas essayé avec ***var je l'avais fait avec ** . JE vais essayer avec ça et voir ça pourrait me servir une autre fois, sinon j'ai changé un peu mon code et ça marche .
0