![]() |
AW: 2 Arrays vergleichen\sortieren
Ok das Problem hat sich erledigt.. SortShortTagArray aber noch nicht.
Wer vergleichen will.
Delphi-Quellcode:
gruss
function TSkinSpriteContainer.GetObjectOrder(hParent: HWND): Integer;
var gP, UB: Integer; K, Count: Integer; A1, A2: TArray<short>; // nur noch 512 Einträge zur Verfügung muss sehen ob ich das Array nicht wieder erhöhe. // 512 Objekte auf einer Form sind schnell erreicht. buffer: array [0 .. 1023] of Short; begin gP := gPropertyItem(hParent); if (gP > -1) then begin if (g_Prop[gP].ordersize <> 0) then begin result := gP; exit; end; end; UB := High(g_Obj); if (UB > 0) then // müsste eigentlich "-1" sein weil das Array in Delphi bei 0 anfängt. (Muss vorher noch prüfen welche Auswirkungen das hat) begin Count := 0; // hier eigentlich das gleiche -1 SetLength(A1, UB + 1); SetLength(A2, UB + 1); for K := 0 to UB do // ist der höchste Array Index deshalb kein "UB - 1" begin if (g_Obj[K].Handle = hParent) then begin A1[Count] := (g_Obj[K].order); A2[Count] := (K); inc(Count); end; end; //ARRAY SORT A1() FOR Count, TAGARRAY A2(); //SortShortTagArray (A1, A2, nCount); noch nicht fertig FillChar(buffer, sizeof(buffer), 0); for K := 0 to Count do MoveMemory(PByte(@buffer[0]) + K * sizeof(Short), @A2[K], sizeof(Short)); FillChar(A1, sizeof(A1), 0); FillChar(A2, sizeof(A2), 0); if (gP < 0) then begin gP := High(g_Prop) + 1; SetLength(g_Prop, gP + 1); end; g_Prop[gP].Handle := hParent; MoveMemory(@g_Prop[gP].Order, @buffer[0], sizeof(buffer)); g_Prop[gP].Ordersize := Count - 1; // Array beginnt bei 0 alternativ kann ich Count direkt -1 zuweisen end; Result := gP; end; |
AW: 2 Arrays vergleichen\sortieren
Hall Emil,
nur mal was ich auf die schnell gesehen habe Zitat:
|
AW: 2 Arrays vergleichen\sortieren
Zitat:
Der Speicher für das Array wird am Ende der Methode automatisch freigegeben. |
AW: 2 Arrays vergleichen\sortieren
Zitat:
liest sich für mich immer flüssiger..... |
AW: 2 Arrays vergleichen\sortieren
Zitat:
Wenn du wirklich aktiv Speicher freigeben willst, dann benutz zumindest SetLength(array, 0); |
AW: 2 Arrays vergleichen\sortieren
Kleiner Einspruch: es handelt sich ja um ein dynamisches Array, und da gilt (
![]() Zitat:
|
AW: 2 Arrays vergleichen\sortieren
Zitat:
Nicht immer alles in einer Zeile Lösen wollen, das führt zu nix. Das ist schwer lesbar und macht es kompliziert. Komplizierte Dinge führen zu Fehlern, das regt dich auf. Wenn du dich aufregst, wirst du unsachlich. Wenn du unsachlich wirst, suchst du den Fehler bei dem Computer, dem Compiler, dem verwendeten Framework, der WinApi, der Sprache und/oder den Leuten, die dir nur helfen wollen und dabei auch mal ihre Worte nicht in Zuckerwatte packen. Ist ja auch kein Streichelzoo hier!
Code:
PVOID Destination, Source;
SIZE_T MemorySize; MemorySize = sizeof(short); Destination = &buffer[0] + (K * MemorySize); Source = &A2[K]; MoveMemory(Destination, Source, MemorySize);
Delphi-Quellcode:
var
Destination, Source: Pointer; MemorySize: SIZE_T; begin ... MemorySize := SizeOf(Short); Destination := Pointer(NativeUInt(@buffer[0]) + K * MemorySize); Source := @A2[K]; MoveMemory(Destination, Source, MemorySize); |
AW: 2 Arrays vergleichen\sortieren
Zitat:
|
AW: 2 Arrays vergleichen\sortieren
Delphi-Quellcode:
Das ist keine schlechte Erklärung bzw. zu zeigen wie MoveMemory Arbeitet.
var
Destination, Source: Pointer; MemorySize: SIZE_T; begin ... MemorySize := SizeOf(Short); Destination := Pointer(NativeUInt(@buffer[0]) + K * MemorySize); Source := @A2[K]; MoveMemory(Destination, Source, MemorySize); Aber sorry hier eine Funktion in 20 teile zu zerlegen macht nicht wirklich sinn. Hilfsvariablen und Funktionen einzurichten mach sinn bei immer widerkehrenden Mechanismen aber nicht bei einer Zeile Code. Habe noch nirgends gesehen das jemand CopyMemory in 100 Zeilen zerlegt. gruss |
AW: 2 Arrays vergleichen\sortieren
Zitat:
Das ist kaum Overhead, ist besser lesbar und vor allen besser debugbar. Wenn du es gleich so hingeschrieben hättest, dann hättest du auch sofort verstanden wo dein Problem liegt. So haste erstmal ewig rumgeflucht und gedacht das Delphi sich hier anderes als C++ verhält bei einer WinApi-Funktion. Das dem nicht so ist, siehste ja jetzt. Die Leute, die solche Sachen nicht in "100 Zeilen" (danke für die schlechte Polemik) zerteilen (müssen), wissen in der Regel aber auch was sie tun. Du bist - wie du selber betonst - halt Laie und manche Feinheiten sind dir fremd oder unverständlich (C++-Char -> Delphi-Byte, Größen von Datentypen, Operator-Überladung, Zeigerarithmetik...etc.). |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:32 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz