![]() |
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:
Hier nehme ich an, das das ein record ist. Also
typedef enum {
wmpioerr_noerror, wmpioerr_invalidcall, wmpioerr_invalidfilename, wmpioerr_invalidfileext, wmpioerr_fileopenerror, wmpioerr_eofunexpected, wmpioerr_syntaxerror, wmpioerr_invalidformat, wmpioerr_invalidchunk, wmpioerr_unknown } wmpio_errors;
Delphi-Quellcode:
Was mich hier wundert ist, dass keine Datentypen angegeben werden.
wmpio_errors = record
... bla bla end; 2.
Delphi-Quellcode:
Wie schreibt man das in Delphi?
#define MDLTYP_UNDEF 0x0000
#define MDLTYP_SPRITE 0x0100 3.
Delphi-Quellcode:
Dieses "|"-Zeichen. War das ein ODER?
...
wmpioobj_start = 0x10 | wmpioobj_entity, ... 4. Und jetzt noch einige Datentypen ( und Zeiger )
Delphi-Quellcode:
Wo ist der Unterschied zwischen INT und CONST INT ?
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 Ich wäre Euch sehr dankbar, wenn Ihr mir sagen könnt, wie man diese Definitionen in Delphi schreibt. Vielen Dank |
Re: Header in Delphi konvertieren
fangen wir mal an:
1:
Delphi-Quellcode:
ist kein record, sondern ein enum type
typedef enum {
wmpioerr_noerror, wmpioerr_invalidcall, wmpioerr_invalidfilename, wmpioerr_invalidfileext, wmpioerr_fileopenerror, wmpioerr_eofunexpected, wmpioerr_syntaxerror, wmpioerr_invalidformat, wmpioerr_invalidchunk, wmpioerr_unknown } wmpio_errors; 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:
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 |
Re: Header in Delphi konvertieren
Code:
entspricht:
#define MDLTYP_UNDEF 0x0000
#define MDLTYP_SPRITE 0x0100
Delphi-Quellcode:
const
MDLTYP_UNDEF = $0000; // das $ Zeichen bedeutet: Hexadezimal, das entspricht dem 0x in C/C++ MDLTYP_SPRITE = $0100; |
Re: Header in Delphi konvertieren
also
![]() Das nutze ich immer wenn ich was Crosscompile Wenn da steht Define dann sind das in Delphi glaubig nur Constanten also
Delphi-Quellcode:
[arg shmia war schneller ;) ]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; |
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. |
Re: Header in Delphi konvertieren
Zitat:
procedure deineprocedure(var deinpointer: PDeinTyp); Zitat:
zu 4: was fehlt dir da noch?wurde doch alles gesagt oder nicht? |
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 |
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 ? |
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:
Das ist ein interessantes Sortiment von Variablendeklarationen.
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
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. |
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. |
Re: Header in Delphi konvertieren
Moin Gargamel,
Zitat:
Du musst diesen dann nur an jeder Stelle entsprechend ersetzen. @Robert: Das hier
Delphi-Quellcode:
wäre wohl eher
const unsigned char * palette;
Delphi-Quellcode:
immerhin steht da ja unsigned char.
palette : PByte;
|
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. |
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.
|
Re: Header in Delphi konvertieren
Achso? Wusst ich garnicht.
Das heisst also, es ist egal, ob ich filename:PChar schreibe oder dateiname:PChar; ...? |
Re: Header in Delphi konvertieren
Moin Gargamel,
Zitat:
|
Re: Header in Delphi konvertieren
wichtig ist nur der speicherbereich auf den du verweist.
die bezeichner sidn da doch vollkommen wurscht :-) |
Re: Header in Delphi konvertieren
Ich muss schon wieder nerven:
Delphi-Quellcode:
Was bedeutet denn hier union? Kann ich das weglassen oder gibt es dafür in Delphi auch etwas?
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 }; |
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.
|
Re: Header in Delphi konvertieren
Zitat:
Union kann man mit variant records vergleichen, ![]() 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