MoveMemory(Pointer(NativeUInt(@buffer[0])) + K * sizeof(Short), @A2[K], sizeof(Short));
Das gleiche Problem.
Da ist dir allerdings auch eine Klammer verrutscht. Pointer() darfst du erst schließen, nachdem du fertig addiert hast.
MoveMemory(PByte(@buffer[0]) + K * sizeof(Short), @A2[K], sizeof(Short));
Lässt sich kompilieren aber ob es richtig ist bzw.. die Daten korrekt verarbeitet werden ist mir nicht ersichtlich.
Sollte passen; ist zumindest die empfohlene Vorgenehsweise für genau solche Dinge.
Delphi-Quellcode:
procedure TSkinSpriteContainer.gDrawZorderObjects(WinHandle: HWND; hDCdest: HDC;
InPrintMode: Integer);
var
K, Item, gP: Integer;
begin
Item := 0;
...
MoveMemory(@Item, g_Prop[gP].order + K * sizeof(short), sizeof(short)); // Das Item hier müsste inkrementiert werden geht aber nicht.
...
end;
Nicht, wenn an
g_Prop[gP].order + K * sizeof(short)
eine 0 (bzw. 2 Nullen) im Speicher steht.
Fakt ist das MoveMemory eine einfache
Win32 API ist und von allen Sprachen gleich interpretiert werden sollte.
Also warum funktioniert es unter C++ und nicht mit Delphi.
Dein konkretes Problem ist ja unabhängig von der
API. Die Funktion macht unter beiden Sprachen das Gleiche; der Unterschied liegt im Aufruf. Hier unterscheiden sich die Sprachen wie gesagt in der unterschiedlichen Zeigerarithmetik. Was man hier präferiert ist ein Stück weit Geschmackssache. C/C++ ist hier eher implizit (und auch um einiges komplizierter) und bei Delphi musst du explizit casten.
MoveMemory(@buffer[K * sizeof(Short)], @A2[K], sizeof(Short));
geht auch.
Dann aber bitte ohne das
SizeOf(Short)
im Index