IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

erreur dans un fichier include


Sujet :

Delphi

  1. #1
    Membre confirmé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Points : 523
    Points
    523
    Par défaut erreur dans un fichier include
    Bonjour,
    j'ai donc réussit à compiler les composant asphyre dans C++Builder en modifiant beaucoup de fichiers pour les rendre compatible mais j'ai maintenant une erreur que je ne comprend pas. J'ai obtenu tous les composants et donc pu compiler les fichiers pas. Ce qui m'a permis d'obtenir des fichiers include en hpp. Seulement, des parties des fichiers include ne correspondent pas aux fichiers pas.

    Par exemple le code suivant du fichier pas : (le fichier n'est pas entier, je n'ai mis que ce qui est pertinent)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    interface
     
    //---------------------------------------------------------------------------
    uses
     Types, Classes, SysUtils, AsphyreDef;
     
    //---------------------------------------------------------------------------
    type
     TAsphyreSubscriber = class;
     
    //---------------------------------------------------------------------------
     TAsphyrePublisherClass = class of TAsphyrePublisher;
     
    //---------------------------------------------------------------------------
     TAsphyrePublisher = class(TComponent)
     private
      Data: array of TAsphyreSubscriber;
     protected
      procedure Subscribe(Obj: TAsphyreSubscriber);
      procedure Unsubscribe(Obj: TAsphyreSubscriber);
      function FindSubscriber(Obj: TAsphyreSubscriber): Integer;
     
      function Notify(Msg: Cardinal): Boolean;
     public
     
      constructor Create(AOwner: TComponent); override;
      destructor Destroy(); override;
     end;
     
    //---------------------------------------------------------------------------
     TAsphyreSubscriber = class(TComponent)
     private
      FPublisher: TAsphyrePublisher;
     
      procedure SetPublisher(const Value: TAsphyrePublisher);
      procedure SearchForPublisher();
     protected
      function HandleNotice(Msg: Cardinal): Boolean; virtual;
      function PublisherClass(): TAsphyrePublisherClass; virtual;
     
      procedure Notification(AComponent: TComponent;
       Operation: TOperation); override;
     public
     
      constructor Create(AOwner: TComponent); override;
      destructor Destroy(); override;
     published
      property Publisher: TAsphyrePublisher read FPublisher write SetPublisher;
     end;
     
    //---------------------------------------------------------------------------
    donne le ficheir hpp suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    // Borland C++ Builder
    // Copyright (c) 1995, 2002 by Borland Software Corporation
    // All rights reserved
     
    // (DO NOT EDIT: machine generated header) 'AsphyreSubsc.pas' rev: 6.00
     
    #ifndef AsphyreSubscHPP
    #define AsphyreSubscHPP
     
    #pragma delphiheader begin
    #pragma option push -w-
    #pragma option push -Vx
    #include <AsphyreDef.hpp>	// Pascal unit
    #include <SysUtils.hpp>	// Pascal unit
    #include <Classes.hpp>	// Pascal unit
    #include <Types.hpp>	// Pascal unit
    #include <SysInit.hpp>	// Pascal unit
    #include <System.hpp>	// Pascal unit
     
    //-- user supplied -----------------------------------------------------------
     
    namespace Asphyresubsc
    {
    //-- type declarations -------------------------------------------------------
    typedef TMetaClass*TAsphyrePublisherClass;
     
    typedef DynamicArray<TAsphyreSubscriber* >  AsphyreSubsc__2; //l'erreur est ici
     
    class DELPHICLASS TAsphyrePublisher;
    class DELPHICLASS TAsphyreSubscriber;
    class PASCALIMPLEMENTATION TAsphyrePublisher : public Classes::TComponent 
    {
    	typedef Classes::TComponent inherited;
     
    private:
    	DynamicArray<TAsphyreSubscriber* >  Data;
     
    protected:
    	void __fastcall Subscribe(TAsphyreSubscriber* Obj);
    	void __fastcall Unsubscribe(TAsphyreSubscriber* Obj);
    	int __fastcall FindSubscriber(TAsphyreSubscriber* Obj);
    	bool __fastcall Notify(unsigned Msg);
     
    public:
    	__fastcall virtual TAsphyrePublisher(Classes::TComponent* AOwner);
    	__fastcall virtual ~TAsphyrePublisher(void);
    };
     
     
    class PASCALIMPLEMENTATION TAsphyreSubscriber : public Classes::TComponent 
    {
    	typedef Classes::TComponent inherited;
     
    private:
    	TAsphyrePublisher* FPublisher;
    	void __fastcall SetPublisher(const TAsphyrePublisher* Value);
    	void __fastcall SearchForPublisher(void);
     
    protected:
    	virtual bool __fastcall HandleNotice(unsigned Msg);
    	virtual TMetaClass* __fastcall PublisherClass(void);
    	virtual void __fastcall Notification(Classes::TComponent* AComponent, Classes::TOperation Operation);
     
    public:
    	__fastcall virtual TAsphyreSubscriber(Classes::TComponent* AOwner);
    	__fastcall virtual ~TAsphyreSubscriber(void);
     
    __published:
    	__property TAsphyrePublisher* Publisher = {read=FPublisher, write=SetPublisher};
    };
     
     
    //-- var, const, procedure ---------------------------------------------------
     
    }	/* namespace Asphyresubsc */
    using namespace Asphyresubsc;
    #pragma option pop	// -w-
    #pragma option pop	// -Vx
     
    #pragma delphiheader end.
    //-- end unit ----------------------------------------------------------------
    #endif	// AsphyreSubsc
    j'ai indiqué où est l'erreur. Il déclare quelques chose qui n'est pas dans le fichier pas. J'ai fait une recherche dans l'ensemble des fichiers et "AsphyreSubsc__2" n'existe que dans ce fichier hpp. D'où vient-il et commant faire pour s'en débarasser? Parce que même si je déplace la ligne un peu plus bas (pour qu'il puisse l'utiliser) ou si je la supprime, le fichier est regénérer à chaque fois que je recompile les composants pour rajouter des modules ou des fonctions.

    Et j'ai un autre problème dans un autre fichier.
    dans un hpp j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    typedef _DIACTIONA *PDIActionA;
     
    typedef _DIACTIONW *PDIActionW;
     
    typedef _DIACTIONA *PDIAction;
     
    typedef _DIACTIONA  TDIActionA;
     
    typedef _DIACTIONW  TDIActionW;
     
    typedef _DIACTIONA  TDIAction;
    sachant qu'il ne déclare jamais _DIACTIONA ou _DIACTIONW
    et voici la partie du pas qui a autogénérer de hpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    {$IFDEF DIRECTINPUT_VERSION_8} (* #if(DIRECTINPUT_VERSION > 0x0700) *)
     
    type
      PDIActionA = ^TDIActionA;
      PDIActionW = ^TDIActionW;
      PDIAction = PDIActionA;
      _DIACTIONA = packed record
        uAppData: Pointer;
        dwSemantic: DWORD;
        dwFlags: DWORD;
        case Byte of
          0: (
            lptszActionName: PAnsiChar;
            guidInstance: TGUID;
            dwObjID: DWORD;
            dwHow: DWORD;
           );
          1: (
            uResIdString: LongWord;
          );
      end;
      {$EXTERNALSYM _DIACTIONA}
      _DIACTIONW = packed record
        uAppData: Pointer;
        dwSemantic: DWORD;
        dwFlags: DWORD;
        case Byte of
          0: (
            lptszActionName: PWideChar;
            guidInstance: TGUID;
            dwObjID: DWORD;
            dwHow: DWORD;
           );
          1: (
            uResIdString: LongWord;
          );
      end;
      {$EXTERNALSYM _DIACTIONW}
      _DIACTION = _DIACTIONA;
      {$EXTERNALSYM _DIACTION}
      DIACTIONA = _DIACTIONA;
      {$EXTERNALSYM DIACTIONA}
      DIACTIONW = _DIACTIONW;
      {$EXTERNALSYM DIACTIONW}
      DIACTION = DIACTIONA;
      {$EXTERNALSYM DIACTION}
      TDIActionA = _DIACTIONA;
      TDIActionW = _DIACTIONW;
      TDIAction = TDIActionA;
    Une idée?
    Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef DynamicArray<TAsphyreSubscriber*>  AsphyreSubsc__2;
    si j'ai quelque souvenir de C++, il déclare un type AsphyreSubsc__2 qui est un Array de TAsphyreSubscriber

    j'aurais plutôt écrit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef DynamicArray<TAsphyreSubscriber*>  ArrayOfAsphyreSubsc;
    tu peux donner le message précis ?
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre confirmé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Points : 523
    Points
    523
    Par défaut
    L'erreur est :
    [C++ Erreur] AsphyreSubsc.hpp(27): E2451 Symbole 'TAsphyreSubscriber' non défini
    Le problème, c'est que le TAsphyreSubscriber est défini un peu plus bas dans le fichier. D'autant plus embêtant que AsphyreSubsc__2 n'existe dans le fichier pas.

    Pourquoi le fichier hpp n'est pas conforme au fichier pas?

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    AsphyreSubsc__2 ne doit pas être déclaré dans le pas puisque c'est un type généré par C++ qui n'est que pour la compilation C, c'est l'inverse de la syntaxe delphi, en C, on met le nom de la variable souvent en dernier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int Chiffre;
    Chiffre: integer;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    typedef DynamicArray<TAsphyreSubscriber*>  AsphyreSubsc__2;
    type AsphyreSubsc__2 = Array of TAsphyreSubscriber
    et je pense avec compris ton problème, c'est le fait d'avoir une déclaration class forward de TAsphyreSubscriber, et ça le C, il connait pas ce genre de syntaxe je pense
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre confirmé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Points : 523
    Points
    523
    Par défaut
    Merci, cela fonctionne maintenant. Le code est devenu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    interface
     
    //---------------------------------------------------------------------------
    uses
     Types, Classes, SysUtils, AsphyreDef;
     
    //---------------------------------------------------------------------------
    type
    // TAsphyreSubscriber = class;
     TAsphyrePublisher = class;
    //---------------------------------------------------------------------------
     TAsphyrePublisherClass = class of TAsphyrePublisher;
     
    //---------------------------------------------------------------------------
     TAsphyreSubscriber = class(TComponent)
     private
      FPublisher: TAsphyrePublisher;
     
      procedure SetPublisher(const Value: TAsphyrePublisher);
      procedure SearchForPublisher();
     protected
      function HandleNotice(Msg: Cardinal): Boolean; virtual;
      function PublisherClass(): TAsphyrePublisherClass; virtual;
     
      procedure Notification(AComponent: TComponent;
       Operation: TOperation); override;
     public
     
      constructor Create(AOwner: TComponent); override;
      destructor Destroy(); override;
     published
      property Publisher: TAsphyrePublisher read FPublisher write SetPublisher;
     end;
     
    //---------------------------------------------------------------------------
     TAsphyrePublisher = class(TComponent)
     private
      Data: array of TAsphyreSubscriber;
     protected
      procedure Subscribe(Obj: TAsphyreSubscriber);
      procedure Unsubscribe(Obj: TAsphyreSubscriber);
      function FindSubscriber(Obj: TAsphyreSubscriber): Integer;
     
      function Notify(Msg: Cardinal): Boolean;
     public
     
      constructor Create(AOwner: TComponent); override;
      destructor Destroy(); override;
     end;
    En fait, les 2 classes ont besoin de l'autre et en inversant l'ordre de référencement et du coup, le hpp est bon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    typedef TMetaClass*TAsphyrePublisherClass;
     
    class DELPHICLASS TAsphyreSubscriber;
    class DELPHICLASS TAsphyrePublisher;
    typedef DynamicArray<TAsphyreSubscriber* >  AsphyreSubsc__3;
     
    class PASCALIMPLEMENTATION TAsphyrePublisher : public Classes::TComponent
    J'ai toujours le 2ème problème, c'est à dire que dans un autre fichier, il ne déclare pas tout.

  6. #6
    Membre confirmé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Points : 523
    Points
    523
    Par défaut
    C'est bon. Les struct n'étaient pas incluses à cause des directives "$EXTERNALSYM"

    Merci pour tout

  7. #7
    Membre confirmé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Points : 523
    Points
    523
    Par défaut
    Finalement, j'ai toujours un problème.

    Le début du fichier pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    type
     TGuiControl = class(TGuiComponent)
     private
      Controls: array of TGuiControl;
    Le hpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    typedef DynamicArray<TGuiControl* >  GuiControls__2; //c'est toujours cette ligne qui pose problème
     
    class DELPHICLASS TGuiControl;
    class PASCALIMPLEMENTATION TGuiControl : public Guicomponents::TGuiComponent
    {
    	typedef Guicomponents::TGuiComponent inherited;
     
    public:
    	TGuiControl* operator[](int Index) { return Control[Index]; }
     
    private:
    	DynamicArray<TGuiControl* >  Controls;
    La class dispose d'un tableau de elle-même (ou ressemblant).
    Non seulement je ne comprend pas comment cela est possible mais en plus, comment je peux faire pour qu'il mette la ligne un peu plus bas?

    EDIT : Comme il n'y a qu'une seule fois ce problème, je modifie le fichier à chaque fois qu'il le faut. C'est pas parfait mais je n'ai pas trouvé d'autres solutions.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur dans le fichier de lancement
    Par sboober dans le forum JWS
    Réponses: 2
    Dernier message: 14/04/2009, 17h41
  2. erreur dans un fichier include
    Par gandf dans le forum C++Builder
    Réponses: 3
    Dernier message: 02/04/2007, 14h44
  3. Réponses: 7
    Dernier message: 23/04/2006, 23h07
  4. Erreur dans un fichier Yacc
    Par gRaNdLeMuRieN dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 20/08/2005, 20h50
  5. [Servlet] Erreur dans le fichier web.xml
    Par Crazyblinkgirl dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 05/07/2004, 15h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo