Einzelnen Beitrag anzeigen

Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#28

AW: 2 Arrays vergleichen\sortieren

  Alt 23. Nov 2017, 16:03
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
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat