Delphi <> Lazarus Konvertierung

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
papaschlumpf
Beiträge: 1
Registriert: Fr 20. Jun 2008, 23:51

Delphi <> Lazarus Konvertierung

Beitrag von papaschlumpf »

Hallo allerseits.
Ich bin hier auf ein kleineres Lazarus bzw Compiler Problem gestossen wo ich nicht so recht weiss wie man es in Lazarus umsetzten kann.

orginal c++ Code

Code: Alles auswählen

typedef DWORD (CALLBACK STREAMPROC)(HSTREAM handle, void *buffer, DWORD length, void *user);
 
// special STREAMPROCs
#define STREAMPROC_DUMMY                (STREAMPROC*)0          // "dummy" stream
#define STREAMPROC_PUSH                 (STREAMPROC*)-1         // push stream
delphi übersetzung (funktioniert)

Code: Alles auswählen

type
 
  STREAMPROC = function(handle: HSTREAM; buffer: Pointer; length: DWORD; user: Pointer): DWORD; stdcall; 
 
const
  // special STREAMPROCs
  STREAMPROC_DUMMY : STREAMPROC = STREAMPROC(0);  // "dummy" stream
  STREAMPROC_PUSH  : STREAMPROC = STREAMPROC(-1); // push stream
Und hier kommt das Problem mit Lazarus ins Spiel

Compiler meckert
Illegal expression

Für Tipps wäre ich dankbar
Gruss
Chris

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Beitrag von mschnell »

Die Übretsetzung nach Pascal ise m.E. nicht korrekt. STREAMPROC ist bereits ein pointer. Es fehlt eine weitere Indirection (STREAMPROC*). Anscheinend soll ein Array o.ä. von funktionalen Pointern bearbeitet werden, bei bestimmten Eingangs-werten (0 und -1) aber nicht die Funktion (der in's array eingetragene pointer) verwendet werden, sondern etwas spezielles getan werden.

Erstaunlich, wemm das in Delphi wunschgemäss funktioniert.

Geht das vielleicht ?

Code: Alles auswählen

type
 
  STREAMPROC = function(handle: HSTREAM; buffer: Pointer; length: DWORD; user: Pointer): DWORD; stdcall;
 PSTREAMPROC = ^STREAMPROC;
 
const
  // special STREAMPROCs
  STREAMPROC_DUMMY : STREAMPROCP = STREAMPROCP(0);  // "dummy" stream
  STREAMPROC_PUSH  : STREAMPROCP = STREAMPROCP(-1); // push stream

Benutzeravatar
theo
Beiträge: 10927
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

So vielleicht?

STREAMPROC_DUMMY = Pointer(0); // "dummy" stream
STREAMPROC_PUSH = Pointer(-1); // push stream

Hier gibt's übrigens eine FPC Kompatible bass.pas afaics

http://fisheye3.atlassian.com/browse/~r ... i/bass.pas" onclick="window.open(this.href);return false;

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Beitrag von mschnell »

theo hat geschrieben: STREAMPROC_DUMMY = Pointer(0); // "dummy" stream
Das ist aber nicht das, was der C-Code sagt. Da wird nicht ein Wert einem STREAMPROC_DUMMY zugewiesen, sondern einem Zeiger auf einen solchen.

im Code müsste das so ähnluch verwendet werden:

Code: Alles auswählen

STREAMPROC* x;
  x = STREAMPROC_DUMMY;
und nicht so:

Code: Alles auswählen

STREAMPROC x;
  x = STREAMPROC_DUMMY;
-Michael

Benutzeravatar
theo
Beiträge: 10927
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Ich würde mal sagen das ist das gleiche, nur das bei deiner Variante typsiert wird. Deine Variante ist besser, aber letztlich dürfte es egal sein.

Der Vorschlag ist von hier.
http://fisheye3.atlassian.com/browse/~r ... i/bass.pas" onclick="window.open(this.href);return false;

Antworten