Hallöchen Leute!!!
Bin sicher hier gibts ein paar schlaue Leute die Ahnung haben!
Bin grade dabei die libMikMod (Soundengine) von C nach Delphi zu portiern. Habe auch schon immerhin 385 KB Delphi Delphi Source geschrieben und das ganze compiled auch schon sehr gut! Nur leider treten noch ne menge bugs auf durch die Portirung. Primär machen mir die Pointer Kopfzerbrechen! Die Programmierer der LibMikMod machen von den ausergewöhnlichsten ZeigerOperationen gebrauch. Jetzt meine eigentliche Frage :
Das is der Orginale C Source
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| static unsigned char *rowstart; /* startadress of a row */ static unsigned char *rowend; /* endaddress of a row (exclusive) */ static unsigned char *rowpc; /* current unimod(tm) programcounter */
static unsigned char lastbyte; /* for UniSkipOpcode() */
void UniSetRow(unsigned char * t) { rowstart = t; rowpc = rowstart; rowend = t?rowstart+(*(rowpc++)&0x1f):t; } |
Jetzt wie ich das in Delphi geschreiben habe :
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| var rowstart : PBYTE; rowend : PBYTE; rowpc : PBYTE; lastbyte : BYTE; procedure UniSetRow(t: PBYTE); begin rowstart := t; rowpc := rowstart; if t <> nil then begin rowend := Ptr(Cardinal(rowstart) + (rowpc^ and $1F)); inc(rowpc); end else rowend := t; end; |
Könnte mir einer sagen ob ich das so richtig gemacht habe oder ob ich da daneben liegen. Wäre für Tipps zur Optimierung des Code sehr Dankbar!
Achso noch eine Sache :
In C kann mann ja auf die einzelnen Felder eines Zeigers wie bei einem Array zugreifen bzw. einen Wert zuweisen also:
C Code:
Quelltext
1: 2: 3: 4: 5:
| int *p;
p=(int*)malloc(sizeof(int)*5);
p[4] = 1234; |
Und müsste das so in Delphi aussehen ??
Delphi code:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| var p : PInteger;
...
GetMem(p, sizeof(Integer)*5);
inc(p,4);
p^:=1234;
dec(p,4); |
Müsste Das so In Delphi ausschauen oder mach ich nen Fehler?!
Nagut das reicht erstmal hoffe jmd. kann damit was Anfangen.
Mfg Khyron