Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Header in Delphi konvertieren (https://www.delphipraxis.net/96982-header-delphi-konvertieren.html)

Gargamel 2. Aug 2007 15:56


Header in Delphi konvertieren
 
Hi

Ich MUSS ( von Wollen kann keine Rede sein ) eine Header-Datei so umschreiben, dass ich diese in Delphi nutzen kann.
Da ich aber von C keine Ahnung habe, ergeben sich damit Probleme.

Ich will Euch nicht mit der ganzen h-Datei langweilen, sondern zeige Euch nur einige wenige Zeilen, von denen ich def. nicht weiss, wie ich diese umsetzen soll.

Fangen wir an:

1.

Delphi-Quellcode:
typedef enum {
   wmpioerr_noerror,
   wmpioerr_invalidcall,
   wmpioerr_invalidfilename,
   wmpioerr_invalidfileext,
   wmpioerr_fileopenerror,
   wmpioerr_eofunexpected,
   wmpioerr_syntaxerror,
   wmpioerr_invalidformat,
   wmpioerr_invalidchunk,
   wmpioerr_unknown

} wmpio_errors;
Hier nehme ich an, das das ein record ist. Also

Delphi-Quellcode:
wmpio_errors = record
 ... bla bla
end;
Was mich hier wundert ist, dass keine Datentypen angegeben werden.



2.

Delphi-Quellcode:
#define MDLTYP_UNDEF      0x0000
#define MDLTYP_SPRITE      0x0100
Wie schreibt man das in Delphi?



3.
Delphi-Quellcode:
...
wmpioobj_start   = 0x10 | wmpioobj_entity,
...
Dieses "|"-Zeichen. War das ein ODER?



4.

Und jetzt noch einige Datentypen ( und Zeiger )
Delphi-Quellcode:
int     * pts_list;
const unsigned char * palette;
const char * name;
const char ** wads_list;
double * ambient;
const int   * fog1;
wmpio_uvw * uv_list; // wmpio_uvw ist ein struct ( record )
double skills[20]; // ich nehme an, das das ein Array ist
Wo ist der Unterschied zwischen INT und CONST INT ?


Ich wäre Euch sehr dankbar, wenn Ihr mir sagen könnt, wie man diese Definitionen in Delphi schreibt.


Vielen Dank

semo 2. Aug 2007 16:19

Re: Header in Delphi konvertieren
 
fangen wir mal an:

1:

Delphi-Quellcode:
typedef enum {
   wmpioerr_noerror,
   wmpioerr_invalidcall,
   wmpioerr_invalidfilename,
   wmpioerr_invalidfileext,
   wmpioerr_fileopenerror,
   wmpioerr_eofunexpected,
   wmpioerr_syntaxerror,
   wmpioerr_invalidformat,
   wmpioerr_invalidchunk,
   wmpioerr_unknown

} wmpio_errors;
ist kein record, sondern ein enum type
also:
Delphi-Quellcode:
type
TWmpio_errors = (
   wmpioerr_noerror,
   wmpioerr_invalidcall,
   wmpioerr_invalidfilename,
   wmpioerr_invalidfileext,
   wmpioerr_fileopenerror,
   wmpioerr_eofunexpected,
   wmpioerr_syntaxerror,
   wmpioerr_invalidformat,
   wmpioerr_invalidchunk,
   wmpioerr_unknown
);


2:
Zitat:

#define MDLTYP_UNDEF 0x0000
#define MDLTYP_SPRITE 0x0100
-->
const
MDLTYP_UNDEF = $0000;
MDLTYP_SPRITE = $0100;

3: ja

4:
Wo ist der Unterschied zwischen INT und CONST INT ?

--> Konstanten sind nicht änderbar, also statische Werte

shmia 2. Aug 2007 16:21

Re: Header in Delphi konvertieren
 
Code:
#define MDLTYP_UNDEF     0x0000 
#define MDLTYP_SPRITE     0x0100
entspricht:
Delphi-Quellcode:
const
  MDLTYP_UNDEF =    $0000; // das $ Zeichen bedeutet: Hexadezimal, das entspricht dem 0x in C/C++
  MDLTYP_SPRITE =   $0100;

Corpsman 2. Aug 2007 16:24

Re: Header in Delphi konvertieren
 
also Hier sthet sehr viel zu C

Das nutze ich immer wenn ich was Crosscompile

Wenn da steht Define dann sind das in Delphi glaubig nur Constanten

also
Delphi-Quellcode:

Const

MDLTYP_UNDEF    = 0;
MDLTYP_SPRITE   = 256 ; // könnte aber auch 4 sein, ich bin mir grad net sicher wie das genau ist.
                          // 0x0100 müste aber eine Hex Zahl sein und deswegen 256


..
C:
wmpioobj_start  = 0x10 | wmpioobj_entity
delphi:
wmpioobj_start  := 16 or wmpioobj_entity;
[arg shmia war schneller ;) ]

Gargamel 2. Aug 2007 16:26

Re: Header in Delphi konvertieren
 
Noch ein Wort zu Punkt 1:

Ich muss also noch bei var schreiben:

var Wmpio_errors:TWmpio_errors;

Soweit richtig?

Das mit typedef enum ist mir jetzt klar.

typedef struct ist aber ein record, oder?

Jetzt fehlt nur noch Punkt 4.

semo 2. Aug 2007 17:52

Re: Header in Delphi konvertieren
 
Zitat:

Noch ein Wort zu Punkt 1:
Ich muss also noch bei var schreiben:
var Wmpio_errors:TWmpio_errors;
Soweit richtig?
du hast einen var parameter der ein pointer darstellt zu übergeben, also:
procedure deineprocedure(var deinpointer: PDeinTyp);


Zitat:

typedef struct ist aber ein record, oder?
japp

zu 4: was fehlt dir da noch?wurde doch alles gesagt oder nicht?

Gargamel 2. Aug 2007 17:54

Re: Header in Delphi konvertieren
 
Bei Punkt 4 sind noch einige wenige Zeilen, bei denen ich nicht weiss, wie ich die in Delphi schreiben soll.

Hier nochmal:

Delphi-Quellcode:
int    * pts_list;
const unsigned char * palette;
const char * name;
const char ** wads_list;
double * ambient;
const int  * fog1;
wmpio_uvw * uv_list; // wmpio_uvw ist ein struct ( record )
double skills[20]; // ich nehme an, das das ein Array ist

Gargamel 2. Aug 2007 19:37

Re: Header in Delphi konvertieren
 
Im Moment stolpere ich über:

const char ** wads_list;
double skills[20];


Kann es sein, dass double skills[20] so geschrieben wird?

skills:array[0..19] of double ?

Robert Marquardt 2. Aug 2007 20:17

Re: Header in Delphi konvertieren
 
Es gibt einen wichtigen Unterschied bei den Enums. In C ist Wmpio_errors immer 4 Bytes lang. In Delphi erst mal nur 1 Byte. Ein {$MINENUMSIZE 4} vor der Deklaration in Delphi behebt das Problem.

Code:
int    * pts_list;
const unsigned char * palette;
const char * name;
const char ** wads_list;
double * ambient;
const int  * fog1;
wmpio_uvw * uv_list; // wmpio_uvw ist ein struct ( record )
double skills[20]; // ich nehme an, das das ein Array ist
Das ist ein interessantes Sortiment von Variablendeklarationen.
Delphi-Quellcode:
var
  pts_list: PInteger; // hier wird affensichtlich ein dynamisch alloziiertes Array von Integern abgelegt
  palette: PChar; // das const besagt in C das die Elemente auf die dr Pointer zeigt nicht veraendert werden duerfen. Der Pointer aber schon.
  name: PChar;
  wads_list: PPChar; // mit "PPChar = ^PChar,". Basis fuer ein dynamisch alloziiertes Array of C strings bei dem die Chars nicht veraendert werden koennen, aber sowohl die PChars als auch wads_list schon.
  ambient: PDouble; // hier wird affensichtlich ein dynamisch alloziiertes Array von Doubles abgelegt
  fog1; // das ksann man wohl jetzt selbst verstehen
  uv_list: Pwmpio_uvw; // mit "Pwmpio_uvw = ^wmpio_uvw;"
  skills: array [0..19] of Double; // ich nehme an, das das ein Array ist. Genau.

Gargamel 2. Aug 2007 21:12

Re: Header in Delphi konvertieren
 
Vielen Dank.

Jetzt habe ich gerade noch ein Problem festgestellt:

const char * file;

Das habe ich ersetzt durch...

file:PChar;

Delphi scheint aber das Wort file reserviert zu haben. So wie es aussieht, muss ich aber file verwenden, da die Datenstruktur 1:1 umgesetzt werden muss.

Christian Seehase 2. Aug 2007 21:19

Re: Header in Delphi konvertieren
 
Moin Gargamel,

Zitat:

Zitat von Gargamel
So wie es aussieht, muss ich aber file verwenden, da die Datenstruktur 1:1 umgesetzt werden muss.

Da file hier nur ein Bezeichner ist, kannst Du als Ersatz nehmen, was immer Du willst.
Du musst diesen dann nur an jeder Stelle entsprechend ersetzen.

@Robert:
Das hier
Delphi-Quellcode:
const unsigned char * palette;
wäre wohl eher
Delphi-Quellcode:
palette : PByte;
immerhin steht da ja unsigned char.

Gargamel 2. Aug 2007 21:25

Re: Header in Delphi konvertieren
 
Im Moment habe ich da meine Zweifel.

Ich nutze eine DLL, die in C geschrieben wurde. In dieser befinden sich Funktionen, welche die Datenstrukturen füllen.
Wenn da keine Variable file dabei ist, wird es doch bestimmt Probleme geben.

Apollonius 2. Aug 2007 21:27

Re: Header in Delphi konvertieren
 
Quatsch. Namen sind einer DLL absolut egal, Variablennamen sind in der compilierten Datei nicht mehr zu sehen, nur die Struktur, also z.B. Anordnung von Feldern in einem Record, muss identisch sein.

Gargamel 2. Aug 2007 21:29

Re: Header in Delphi konvertieren
 
Achso? Wusst ich garnicht.

Das heisst also, es ist egal, ob ich filename:PChar schreibe oder dateiname:PChar; ...?

Christian Seehase 2. Aug 2007 21:31

Re: Header in Delphi konvertieren
 
Moin Gargamel,

Zitat:

Zitat von Gargamel
Das heisst also, es ist egal, ob ich filename:PChar schreibe oder dateiname:PChar; ...?

Korrekt.

semo 2. Aug 2007 22:02

Re: Header in Delphi konvertieren
 
wichtig ist nur der speicherbereich auf den du verweist.
die bezeichner sidn da doch vollkommen wurscht :-)

Gargamel 2. Aug 2007 22:03

Re: Header in Delphi konvertieren
 
Ich muss schon wieder nerven:

Delphi-Quellcode:
union
      void * entity;
      wmpio_LevelEntity * level;   // id == 0
      wmpio_StartEntity * start;   // id == 1
      wmpio_LightEntity * light;   // id == 2
      wmpio_ModelEntity * model;   // id == 3 (7, for model-ex)
      wmpio_SoundEntity * sound;   // id == 4
      wmpio_SunEntity     * sun;   // id == 5
      wmpio_PathEntity  * path;   // id == 6

      wmpio_UndefEntity * undef;   // id == -1
   };
Was bedeutet denn hier union? Kann ich das weglassen oder gibt es dafür in Delphi auch etwas?

Robert Marquardt 3. Aug 2007 05:09

Re: Header in Delphi konvertieren
 
Es ist egal welche Namen mann nimmt, aber man sollte bei Vorlagen nur in Notfaellen wie hier bei file abweichen. Das macht es erheblich einfacher wenn man Originaldokumentation liest.

Klaus01 3. Aug 2007 06:31

Re: Header in Delphi konvertieren
 
Zitat:

Zitat von Gargamel
Ich muss schon wieder nerven:

Delphi-Quellcode:
union
      void * entity;
      wmpio_LevelEntity * level;   // id == 0
      wmpio_StartEntity * start;   // id == 1
      wmpio_LightEntity * light;   // id == 2
      wmpio_ModelEntity * model;   // id == 3 (7, for model-ex)
      wmpio_SoundEntity * sound;   // id == 4
      wmpio_SunEntity     * sun;   // id == 5
      wmpio_PathEntity  * path;   // id == 6

      wmpio_UndefEntity * undef;   // id == -1
   };
Guten Morgen,

etwas bedeutet denn hier union? Kann ich das weglassen oder gibt es dafür in Delphi auch etwas?

Weglassen ist meistens nicht so gut.

Union kann man mit variant records vergleichen, hier ist es recht gut erklärt.

Einen schönen Tag noch
Klaus


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:06 Uhr.

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