Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - C Zeiger nach Delphi portieren


Khyron - Di 03.02.04 22:54
Titel: C Zeiger nach Delphi portieren
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;           //* startadress of a row */
  rowend            : PBYTE;           //* endaddress of a row (exclusive) */
  rowpc             : PBYTE;           //* current unimod(tm) programcounter */
  lastbyte          : BYTE;            //* for UniSkipOpcode() */

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


AndyB - Mi 04.02.04 11:17
Titel: Re: C Zeiger nach Delphi portieren
Khyron hat folgendes geschrieben:

In C kann mann ja auf die einzelnen Felder eines Zeigers wie bei einem Array zugreifen bzw. einen Wert zuweisen also:

In Delphi kann man auch wie bei einem Array arbeiten, wenn man statt PInteger ein PIntegerArray benutzt.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var
  p : PIntegerArray;
begin
  GetMem(p, SizeOf(Integer)*5);
  p[4] := 1234;
  FreeMem(p);
end;