Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   C++ Struct übersetzen zu Delphi record (https://www.delphipraxis.net/85989-c-struct-uebersetzen-zu-delphi-record.html)

Lenny15 7. Feb 2007 15:11


C++ Struct übersetzen zu Delphi record
 
Ich habe folgende Struktur in C++:

Code:
typedef struct cl_enginefuncs_s
{
   // sprite handlers
   HSPRITE                  ( *pfnSPR_Load )         ( const char *szPicName );
   int                  ( *pfnSPR_Frames )         ( HSPRITE hPic );
   int                  ( *pfnSPR_Height )         ( HSPRITE hPic, int frame );
   int                  ( *pfnSPR_Width )         ( HSPRITE hPic, int frame );
   void                  ( *pfnSPR_Set )            ( HSPRITE hPic, int r, int g, int b);
...
...
} cl_enginefunc_t;
Diese Struktur möchte ich gerne in Delphi übersetzen.
HSPRITE ist übrigens nur ein gewöhnlicher Integer;
Folgender ist mein Ansatz:

Delphi-Quellcode:
cl_enginefuncs_s = ^cl_enginefuncs_t;
  cl_enginefuncs_t = packed record
    pfnSprLoad   : function(const szPicName: Pchar): Integer;
    pfnSPR_Frames : function(hpic: Integer);
    ...
    ...
  end;
Stimmt das denn so? Sind das Delphi-Intern jetz auch Funktionszeiger? Oder wie müsste ich das deklarieren? Oder habe ich das ganz falsch verstanden?

Danke schonmal im vorraus. :)

Grüße,
Lenny

Der_Unwissende 7. Feb 2007 15:31

Re: C++ Struct übersetzen zu Delphi record
 
Hi,
sieht eigentlich soweit ganz gut aus. Allerdings würde ich an deiner Stelle für HSPRITE einen Aliastypen in Delphi schaffen. Damit kannst Du einfacher auf Änderungen reagieren (z.B. auch leichter Fehler korrigieren).

Also einfach:
Delphi-Quellcode:
type
  HSPRITE = Integer;

  cl_enginefuncs_s = ^cl_enginefuncs_t;
  cl_enginefuncs_t = packed record
    pfnSprLoad   : function(const szPicName: Pchar): HSPRITE;
    ...
    ...
  end;
Gruß Der Unwissende

Lenny15 7. Feb 2007 15:34

Re: C++ Struct übersetzen zu Delphi record
 
Vielen Dank. :)
Gut zu wissen, dass man auf der richtigen "Spur" ist.

EDIT: Sorry, wie entferne ich nun das Zeichen der "Offenen Frage"?
EDIT2: Hab es gefunden. :thumb:

Robert Marquardt 7. Feb 2007 15:37

Re: C++ Struct übersetzen zu Delphi record
 
Das sieht soweit gut aus. Ja, Funktionsdatentypen sind richtig.
Ob das Record packed sein muss oder nicht ist schwer zu entscheiden. Das kann von den Projektoptionen des C++ Programms abhaengen.
Gleichfalls ob die Funktionen cdecl odeer stdcall brauchen. Eins von beiden brauchen sie. Da es nicht angegeben ist wuerde ich auf cdecl tippen.
Es ist auch angebracht die Funktionsdatentypen als Hilfstypen zu deklarieren.
Delphi-Quellcode:
type
  HSPRITE = Integer;
  SprLoadFunc = function(const szPicName: Pchar): HSPRITE; cdecl;

  cl_enginefuncs_s = ^cl_enginefuncs_t;
  cl_enginefuncs_t = packed record
    pfnSprLoad   : SprLoadFunc;
    ...
    ...
  end;

Lenny15 7. Feb 2007 15:47

Re: C++ Struct übersetzen zu Delphi record
 
Gut, danke. Ich werde testen wie sich das verhält, ich würde auch auf cdecl tippen.
Hilfstypen sind eine gute Idee. :)

EDIT:
Zitat:

Ob das Record packed sein muss oder nicht ist schwer zu entscheiden.
Hmm. Also im C++ Quellcode steht nirgendwo #pragma packed bla (weiss nicht genau wie das jezt hiess). Also wird es wohl doch nicht packed sein. Mal sehn :gruebel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz