Autor Beitrag
Khyron
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Di 03.02.04 22:54 
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


ausblenden 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 :

ausblenden 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:
ausblenden 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: Mi 04.02.04 11:17 
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.

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

_________________
Ist Zeit wirklich Geld?