[C] Declaration cyclique et fichiers .h > JE VAIS DEVENIR FOU

Declaration cyclique et fichiers .h > JE VAIS DEVENIR FOU [C] - C++ - Programmation

Marsh Posté le 14-02-2003 à 02:20:31    

Putain j'y arriverai jamais
Donc soit j'ai pas compris, soit c autre chose
Cette fois je vous colle le test que j'ai fait :
 
Unit1 (classique...)

Code :
  1. //---------------------------------------------------------------------------
  2. #include "Unit2.h"
  3. #include "Unit3.h"
  4. #pragma hdrstop
  5. //---------------------------------------------------------------------------
  6. #pragma argsused
  7. int main(int argc, char* argv[])
  8. {
  9.         int2 vari2;
  10.         int3 vari3;
  11.         vari2 = combine2(vari2,vari3);
  12.         return 0;
  13. }
  14. //---------------------------------------------------------------------------


 
Unit2.cpp

Code :
  1. //---------------------------------------------------------------------------
  2. #include "Unit3.h"
  3. #pragma hdrstop
  4. #include "Unit2.h"
  5. //---------------------------------------------------------------------------
  6. #pragma package(smart_init)
  7. int2 combine2 (int2 v1, int3 v2)
  8. {
  9.         return v1+v2;
  10. }


 
Unit2.h

Code :
  1. //---------------------------------------------------------------------------
  2. #ifndef Unit2H
  3. #define Unit2H
  4. //---------------------------------------------------------------------------
  5. #include "Unit3.h"
  6. typedef int int2;
  7. int2 combine2 (int2 v1, int3 v2);
  8. #endif


 
Unit3.cpp

Code :
  1. //---------------------------------------------------------------------------
  2. #include "Unit2.h"
  3. #pragma hdrstop
  4. #include "Unit3.h"
  5. //---------------------------------------------------------------------------
  6. #pragma package(smart_init)
  7. int3 combine3 (int3 v1, int2 v2)
  8. {
  9.         return v1+v2;
  10. }


 
Unit3.h

Code :
  1. //---------------------------------------------------------------------------
  2. #ifndef Unit3H
  3. #define Unit3H
  4. //---------------------------------------------------------------------------
  5. #include "Unit2.h"
  6. typedef int int3;
  7. int3 combine3 (int3 v1, int2 v2);
  8. #endif


 
Donc voila c un test tout simple, avec un cas tout simple de dependance cyclique... et maintenant > COMMENT ON FAIT ?
Parce qu'actuellement : Erreur a la compil de l'unit3.h "int2" type inconnu

Reply

Marsh Posté le 14-02-2003 à 02:20:31   

Reply

Marsh Posté le 14-02-2003 à 09:22:24    

Dans tes *.h (par exemple toto.h), tu déclare des variables:
 

Code :
  1. #ifndef TOTO_H
  2. #define TOTO_H
  3. //tes machins choses chouettes
  4. #endif


 
EDIT: je vais me reveiller bientôt et je fermera les balises à fur et à mesure ...
EDIT2: je vais me reveiller tout court et je vais lire les messages jusqu'à bout ...


Message édité par western le 14-02-2003 à 12:36:30
Reply

Marsh Posté le 14-02-2003 à 11:40:50    

Bah, déclare tes typedef, avant de faire l'"#include" !

Reply

Marsh Posté le 15-02-2003 à 01:07:56    

Effectivement, chaque header a besoin des deux typedef, alors qu'ils ne seront dispo qu'àprès les deux inclusions.
 
Met les deux typedef dans un header commun, inclus par Unit2.h et Unit3.h.
typedefs.h

Code :
  1. #ifndef typedefsH
  2. #define typedefsH
  3. typedef int int2;
  4. typedef int int3;
  5. #endif



Message édité par Musaran le 15-02-2003 à 01:08:45

---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 15-02-2003 à 11:11:36    

En fait, je voulais dire que au lieu de faire :
 

Code :
  1. //---------------------------------------------------------------------------
  2.   #ifndef Unit3H
  3.   #define Unit3H
  4. //---------------------------------------------------------------------------
  5.   #include "Unit2.h"
  6.   typedef int int3;
  7.   int3 combine3 (int3 v1, int2 v2);
  8.   #endif


 
Il faut faire :

Code :
  1. //---------------------------------------------------------------------------
  2.   #ifndef Unit3H
  3.   #define Unit3H
  4. //---------------------------------------------------------------------------
  5.   typedef int int3;
  6.   #include "Unit2.h"
  7.   int3 combine3 (int3 v1, int2 v2);
  8.   #endif


Reply

Marsh Posté le 15-02-2003 à 12:23:06    

tu peux séparer les données du code.
 
mydata.h :
#include "data2.h"
#include "data3.h"
 
data2.h
typedef int int2;
 
data3.h
typedef int int3;
 
tu inclus mydata là ou tu en as besoin.
 
vu l'exemple que tu donnes, on ne peut pas se rendre compte de grand chose : c'est peut-être un problème de design.

Reply

Marsh Posté le 15-02-2003 à 17:11:39    

oki ca me donne des idees ;)

Reply

Marsh Posté le 16-02-2003 à 01:08:28    

Par contre c'est juste ton exemple
ou je n'ai pas compris l'intérêt de faire
typedef int int2?
 
bah les typedefs ca pue.
 
on peut pas faire de forward declaration
de typedef puisque c'est juste un alias
pour le compilateur et pas une nouvelle
classe (int2 == int3 strictement).
 
Si c'est pour de la type-safety il vaut peut-être mieux
et doit être possible d'utiliser un type enum ou un wrapper de classe entière (quelqu'un a un template qui fait ça proprement ?).
 
LeGreg
edit: pour la derniere solution c'est du C++ donc desole je n'avais pas vu que ca ne s'adressait qu'aux gens qui programmaient en C..


Message édité par LeGreg le 16-02-2003 à 01:18:47

---------------
voxel terrain render engine | animation mentor
Reply

Marsh Posté le 17-02-2003 à 07:16:24    

legreg a écrit :

on peut pas faire de forward declaration de typedef puisque c'est juste un alias
pour le compilateur et pas une nouvelle


J'ai récemment vu ça:

Code :
  1. typedef struct machin* pmach_t;
  2. struct machin{
  3. pmach_t next;
  4. };


Et c'est accepté par mon compilateur.
standard ?


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 17-02-2003 à 12:51:24    

Musaran a écrit :


J'ai récemment vu ça:

Code :
  1. typedef struct machin* pmach_t;
  2. struct machin{
  3. pmach_t next;
  4. };


Et c'est accepté par mon compilateur.
standard ?


 
je ne parle pas de ca.
 
Exemple :  

Code :
  1. typedef list<int> integerList;


 
si je fais dans un .h :

Code :
  1. class integerList;
  2. struct machin
  3. {
  4.   integerList * truc;
  5. };


alors ca ne va pas marcher parce que integerList n'est pas un type ni une classe.  
La raison ? je crois que c'est pour des incohérences dans le système de nommage qu'aurait apportées une telle écriture.
 
LeGreg


Message édité par LeGreg le 17-02-2003 à 12:52:15

---------------
voxel terrain render engine | animation mentor
Reply

Marsh Posté le 17-02-2003 à 12:51:24   

Reply

Marsh Posté le 18-02-2003 à 07:51:11    

Je comprends toujours pas...
Ce que tu dis n'a pas de sens ?
 

Code :
  1. typedef list<int> integerList;
  2. class integerList;

Pas compatible...


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 18-02-2003 à 08:16:59    

justement je te dis que ce n'est pas compatible :)
 
Ca y est?
 
LeGreg


---------------
voxel terrain render engine | animation mentor
Reply

Marsh Posté le 20-02-2003 à 09:27:40    

Ça ne marche pas parce que tu essayes d'utiliser le même nom pour deux type différents: list<int> et une nouvelle classe.
Qu'est-ce que ce serait censé faire ?
 
typedef permet des déclarations anticipées, et on ne peut justement pas e nchanger le sen saprès coup.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Sujets relatifs:

Leave a Replay

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