Probléme d'inclusion

Probléme d'inclusion - C - Programmation

Marsh Posté le 16-05-2005 à 16:47:10    

Alors voila, en ce moment je me trouve avec un programme divisé en plusieurs fichiers .c / .h et mon probléme aparait maintenant à la compilation notement la gestion des .h
 
par exemple j'ai :
 
automate.h

Code :
  1. #ifndef __AUTOMATE_H
  2. #define __AUTOMATE_H
  3. #include "list.h"
  4. typedef struct _state {
  5. char Node ;
  6. int StateID;
  7. int *Terminal ;
  8. char *Subword ;
  9. LIST Next;  /*definie dans list.h*/
  10. } State;
  11. typedef State *AutomatonState ;
  12. ...
  13. #endif /* __AUTOMATE_H */


 
 
et list.h

Code :
  1. #ifndef __LIST_H
  2. #define __LIST_H
  3. #include "automate.h"
  4. typedef struct _cell{
  5. AutomatonState c_state ;
  6. struct _cell *NextCell;
  7. } cellule;
  8. typedef cellule LIST ;
  9. ...
  10. #endif /* __LIST_H */


 
Dans ce cas l'inlusion croisée pose probléme, comment faire pour que ca marche :??:


Message édité par pinguin007 le 16-05-2005 à 17:20:01

---------------
LoD 4 ever && PWC spirit|Le topak de l'iMP-450|inDATOUNEwe trust
Reply

Marsh Posté le 16-05-2005 à 16:47:10   

Reply

Marsh Posté le 16-05-2005 à 17:07:40    

pinguin007 a écrit :


automate.h

Code :
  1. #include "list.h"
  2. typedef struct _state {
  3. char Node ;
  4. int StateID;
  5. int *Terminal ;
  6. char *Subword ;
  7. LIST Next;  /*definie dans list.h*/
  8. } State;
  9. typedef State *AutomatonState ;




Manque les protections contre les inclusions multiples.

#ifndef H_AUTOMATE
#define H_AUTOMATE
...
#endif


Citation :

et list.h

Code :
  1. #include "automate.h"
  2. typedef struct _cell{
  3. AutomatonState c_state ;
  4. struct _cell *NextCell;
  5. } cellule;
  6. typedef cellule LIST




Même punition...

#ifndef H_LIST
#define H_LIST
...
#endif


Citation :

Dans ce cas l'inlusion croisée pose probléme, comment faire pour que ca marche


inclusion croisée sans protection... Ca sent le paté...
 
http://mapage.noos.fr/emdel/codage [...] ser_source
 
[edit]
Ok, tu as ajouté les protections, mais elles ne doivent pas avoir de _ en tête.
 
http://mapage.noos.fr/emdel/codage.htm#nom_underscore
[/edit]
 
Après analyse de ton code, il y a un problème de conception qui n'est pas solvable, tout simplement parce que la conception n'a pas été assez refléchie. Il faut en effet séparer les données de la cellule de l'automate de la structure de liste chainée. L'automate n'a pas à savoir que ces cellules sont en liste. Par contre, la liste peut savoir qu'elle fait une liste de cellules d'automates. Il y a donc une hiérarchie à respecter (oui, je sais, ça fait mal!)
 
Nous avons d'abord des cellules d'automates indépendantes. Elle pourraient former un tableau, une liste, un arbre, peu importe... Aucune référence n'est faite à l'organisation en mémoire.


#ifndef H_AUTOMATE
#define H_AUTOMATE
/* automate.h */
typedef struct state AutomatonState;
 
typedef struct state
{
   char Node;
   int StateID;
   int *Terminal;
   char *Subword;
}
State;
#endif


 
Et puis nous avons une organisation en chaine d'objets 'automate'...


#ifndef H_LIST
#define H_LIST
/* list.h */
#include "automate.h"
 
typedef struct cellule LIST;
 
struct cellule
{
   AutomatonState c_state;
   LIST *NextCell;
};
 
#endif


Je le rappelle au cas où ça ne serait pas évident : il ne peut pas y avoir de bon codage sans une bonne conception préalable.


Message édité par Emmanuel Delahaye le 16-05-2005 à 17:29:10

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 16-05-2005 à 17:20:52    

oups j'ai modifié le premier post, les protections sont sensées être là ^^


---------------
LoD 4 ever && PWC spirit|Le topak de l'iMP-450|inDATOUNEwe trust
Reply

Marsh Posté le 16-05-2005 à 23:44:23    

Enfin problème de conception qui n'est pas solvable...
Suffit de faire ça (je suppose juste que LIST est un pointeur sur cellule et non pas une cellule) :
list.h

#ifndef LIST_H  
#define LIST_H  
typedef struct _cell cellule, *LIST ;
#include "automate.h"  
struct _cell{  
    AutomatonState c_state ;  
    struct _cell *NextCell;  
};  
#endif /* __LIST_H */


automate.h

#ifndef AUTOMATE_H  
#define AUTOMATE_H  
typedef struct _state State, *AutomatonState ;
#include "list.h"  
struct _state {  
    char Node ;      
    int StateID;  
    int *Terminal ;      
    char *Subword ;      
    LIST Next;     /*definie dans list.h*/  
};  
#endif /* __AUTOMATE_H */


 
Si tu veux tout de même que LIST ne soit pas un pointeur c'est possible mais je ne pense pas que ce soit ce que tu veilles faire.
 
PS : Bon après je ne dit pas que la conception n'est pas à revoir.


Message édité par Tarabiscote le 16-05-2005 à 23:50:29
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed