Forum Clubic

Liste chainé de strcuture de taille differentes en C

Bonjour, j’ai un fichier txt que je dois parcourir. Dans ce fichier se trouve des groupements de données. Chaque groupement (de taille variable) est placé dans une structure de taille adapté et déjà défini. J’ai 10 structure différentes.

Il faut donc que je parcoure ce fichier, que j’enregistre au fur et a mesure mes objets dans mes structure, tout en gardant arborescence.

Exemple d’un fichier:


Struc 0
=>Struc 1
==>Struc 2
====>Struc 3
====>Struc 4
=====>Struc 5
===>Struc 6
====>Struc 3
====>Struc 4
===>Struc 6
==>Struc 7
=>Struc 8

Chaque structure ressemble a ceci:


typedef struct {	
	NOP_MND ent_000; //Ceci est une structure pre defini
	char* str_parent; 
} STRUCT_000;

typedef struct {	
	NOP_LDF ent_001; //Ceci est une structure pre defini
	char* str_parent; 
} STRUCT_001;

Je precise bien que chaque structure est différente donc n’est pas de la même taille. et que cette arborescence n’est pas figé donc une fois, la struct 2 est la mère des struct 4 et 5 puis pourra être la mère de la struct 6…

J’ai essayé les liste chainé mais dans tous les exemples, pour garder un pointeur sur la précédente ou suivante structure, il faut connaitre le type, or moi, ce n’est pas figé…

pour le moment, j’arrive a enregistrer les différentes structures en faisant un malloc et realloc a chaque fois que j’agrandis mais je ne trouve pas comment faire les liens entre ces structures


STRUCT_000 *tabEnt_000;
tabEnt_000 = (STRUCT_000 *) malloc(sizeof(STRUCT_000));
...
STRUCT_001 *tabEnt_001;
tabEnt_001 = (STRUCT_001 *) malloc(sizeof(STRUCT_001));
...
while(NULL != fread (buffer,3,1,pFichier.lienFichierIn)){
...
   if (count_ent_001 > 0) 
      tabEnt_001 = (STRUCT_001 *) realloc(tabEnt_001,sizeof(STRUCT_001)*(count_ent_001 + 1));
   memcpy(&tabEnt_001[count_ent_001].ent_001,buffer,sizeof(NOP_LDF));
   //EN GROS ICI IL FAUDRAIT UN TRUC DU GENRE (POUR GARDER QUI EST LA MERE):
   //[b]tabEnt_001[count_ent_001].parent = &tabEnt_000;[/b] //Ceci ne fonctionne pas
  //sachant qu'on peut aussi avoir &tabEnt_001 ou &tabEnt_002 etc...
   
...
}

quelqu’un a une idée?

merci
Edité le 21/07/2010 à 10:26

Je n’ai pas tout saisi… Pourquoi ne pas stocker le type/la taille dans chaque élément de ta liste chainée ?

Sinon, tu as le type union, mais je ne pense pas que ce soit une bonne idée que tu t’en serves…

et bien je ne sais pas justement… mais je ne vois pas trop comment faire…

Comment ca stocker le type et la taille?

Je vois pas !

Hé bien tes item dans ta liste chainée seront de la forme :

typedef struct {
  enum type;
  void* ptr;
} ListItem;

Ou encore :

typedef struct {
  enum type;
  union {
    struct t1 foobar1;
    struct t2 foobar2;
  }
} ListItem;

Mais vu ton niveau, je te le déconseille…

ça pique ça :smiley:

Ben c’est vrai, déjà c’est tordu de vouloir faire ça, mais les union c’est pas un truc à manipuler n’importe comment. Et c’est pas parce qu’une “petite” différence de gestion de mémoire entre Windows & Linux n’a pas plus à mes profs à la FAC fut un temps… :slight_smile:

Pourquoi tu ne fais pas un maillon next dans ta structure qui serait un pointer vers le maillon suivant ?