Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1906 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°309062
-VDV-
Et pas DVD ! Lisez mieux !
Posté le 14-02-2003 à 02:20:31  profilanswer
 

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

mood
Publicité
Posté le 14-02-2003 à 02:20:31  profilanswer
 

n°309090
western
AJMM
Posté le 14-02-2003 à 09:22:24  profilanswer
 

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
n°309169
Kristoph
Posté le 14-02-2003 à 11:40:50  profilanswer
 

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

n°310166
Musaran
Cerveaulté
Posté le 15-02-2003 à 01:07:56  profilanswer
 

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
n°310225
Kristoph
Posté le 15-02-2003 à 11:11:36  profilanswer
 

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


n°310261
youdontcar​e
Posté le 15-02-2003 à 12:23:06  profilanswer
 

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.

n°310408
-VDV-
Et pas DVD ! Lisez mieux !
Posté le 15-02-2003 à 17:11:39  profilanswer
 

oki ca me donne des idees ;)

n°310570
LeGreg
Posté le 16-02-2003 à 01:08:28  profilanswer
 

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
n°310993
Musaran
Cerveaulté
Posté le 17-02-2003 à 07:16:24  profilanswer
 

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
n°311158
LeGreg
Posté le 17-02-2003 à 12:51:24  profilanswer
 

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
mood
Publicité
Posté le 17-02-2003 à 12:51:24  profilanswer
 

n°311741
Musaran
Cerveaulté
Posté le 18-02-2003 à 07:51:11  profilanswer
 

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
n°311744
LeGreg
Posté le 18-02-2003 à 08:16:59  profilanswer
 

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


---------------
voxel terrain render engine | animation mentor
n°313731
Musaran
Cerveaulté
Posté le 20-02-2003 à 09:27:40  profilanswer
 

Ç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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
PHP : Déclaration cookie[access] et les fichiers csv
A quoi correspond des fichiers de base de données .CFF ?Comment joindre des fichiers textes ensemble en javascript
Comment joindre des fichiers textes ensemble avec du javascriptdéclaration avec "module"
savez vous comment rechercher des fichiers en php[Delphi] J'aurai besoin d'un VCL permettant de compresser des fichiers
Déclaration des classes selon la forme de Coplien 
Plus de sujets relatifs à : [C] Declaration cyclique et fichiers .h > JE VAIS DEVENIR FOU


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR