AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

2 Arrays vergleichen\sortieren

Ein Thema von EWeiss · begonnen am 22. Nov 2017 · letzter Beitrag vom 30. Nov 2017
Antwort Antwort
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.662 Beiträge
 
Delphi 12 Athens
 
#1

AW: 2 Arrays vergleichen\sortieren

  Alt 22. Nov 2017, 15:57
Ich bin jetzt nicht so der C++ Spezialist, aber für mich sieht das so aus, als enthalten die Arrays nicht die Records sondern A1 enthält jeweils das Order-Feld und A2 den Index des Records. Was dann allerdings damit passiert entzieht sich noch meinem Verständnis. Da mögen doch jetzt besser die C++ Cracks ran - das ist dann nichts für mich.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: 2 Arrays vergleichen\sortieren

  Alt 22. Nov 2017, 16:09
Ich bin jetzt nicht so der C++ Spezialist, aber für mich sieht das so aus, als enthalten die Arrays nicht die Records sondern A1 enthält jeweils das Order-Feld und A2 den Index des Records. Was dann allerdings damit passiert entzieht sich noch meinem Verständnis. Da mögen doch jetzt besser die C++ Cracks ran - das ist dann nichts für mich.
Trotzdem Danke für deine Hilfe
Habe noch Hoffnung das Zacherl mal drüber schaut wenn er zeit dafür findet.

Es sieht so aus das er nach der ID sortiert.
Sicher bin ich mir jedoch nicht.

Zitat:
I am using it to sort a secondary array in the same order than the main one.
it is used for sorting the z-order of the sprites unique ID.
Es soll so funktionieren wie wenn man eine ListBox sortiert über
Zitat:
That works the same than using a sorted LISTBOX with LB_SETITEMDATA or LB_GETITEMDATA,
gruss

Geändert von EWeiss (22. Nov 2017 um 17:11 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

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

AW: 2 Arrays vergleichen\sortieren

  Alt 22. Nov 2017, 19:53
Ich bin jetzt nicht so der C++ Spezialist, aber für mich sieht das so aus, als enthalten die Arrays nicht die Records sondern A1 enthält jeweils das Order-Feld und A2 den Index des Records. Was dann allerdings damit passiert entzieht sich noch meinem Verständnis. Da mögen doch jetzt besser die C++ Cracks ran - das ist dann nichts für mich.
Trotzdem Danke für deine Hilfe
Habe noch Hoffnung das Zacherl mal drüber schaut wenn er zeit dafür findet.

Es sieht so aus das er nach der ID sortiert.
Stimme Uwe zu. Sortiert wird letztlich über g_zObj[K].order , wie ich das sehe. A1 scheint jeweils die `order` und A2 den dazugehörigen Index zu enthalten.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: 2 Arrays vergleichen\sortieren

  Alt 22. Nov 2017, 20:03
Ich bin jetzt nicht so der C++ Spezialist, aber für mich sieht das so aus, als enthalten die Arrays nicht die Records sondern A1 enthält jeweils das Order-Feld und A2 den Index des Records. Was dann allerdings damit passiert entzieht sich noch meinem Verständnis. Da mögen doch jetzt besser die C++ Cracks ran - das ist dann nichts für mich.
Trotzdem Danke für deine Hilfe
Habe noch Hoffnung das Zacherl mal drüber schaut wenn er zeit dafür findet.

Es sieht so aus das er nach der ID sortiert.
Stimme Uwe zu. Sortiert wird letztlich über g_zObj[K].order , wie ich das sehe. A1 scheint jeweils die `order` und A2 den dazugehörigen Index zu enthalten.
Wie würde das dann aussehen.. Sorry

gruss
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

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

AW: 2 Arrays vergleichen\sortieren

  Alt 22. Nov 2017, 20:53
Sollte in etwa so aussehen. Ist nur so runtergetippt, also kann noch Fehler enthalten:
Delphi-Quellcode:
function GetObjectOrder(hParent: HWND): LongInt;
var
  pZP, UB, K, nCount: LongInt;
  A1, A2: TArray<ShortInt>;
  buffer: array[0..2048 - 1] of Byte;
begin
  pZP := gPropertyItem(hParent);
  if (pZP > -1) then
  begin
    if (g_Prop[pZP].ordersize > 0) then
    begin
      Exit(pZP);
    end;
  end;

  UB = UBOUND(g_zObj);
  if (UB > 0) then
  begin
    K = 0;
    nCount := 0;
    SetLength(A1, UB);
    SetLength(A2, UB);
    for K := 0 to UB - 1 do
    begin
      if (g_zObj[K].hwned = hParent) then
      begin
        A1[nCount] := SmallInt(g_zObj[K].order);
        A2[nCount] := SmallInt(K);
        nCount := nCount + 1;
      end;
    end;

    SortShortTagArray(A1, A2, nCount);

    ZeroMemory(@buffer[0], SizeOf(buffer));
    for K := 0 to nCount - 1 do
    begin
      CopyMemory(PByte(@buffer[0]) + K * SizeOf(SmallInt), @A2[K], SizeOf(ShortInt));
    end;
    SetLength(A1, 0);
    SetLength(A2, 0);

    if (pZP < 0) then
    begin
      pZP := LongInt(UBOUND(g_Prop));
      g_Prop.resize(pZP + 1);
    end;
    g_Prop[pZP].hWnd := hParent;
    CopyMemory(@g_Prop[pZP].order, @buffer[0], SizeOf(buffer));
    g_Prop[pZP].ordersize := nCount;
  end;
  Result := pZP;
end;
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: 2 Arrays vergleichen\sortieren

  Alt 23. Nov 2017, 01:40
Zitat:
Sollte in etwa so aussehen. Ist nur so runtergetippt, also kann noch Fehler enthalten:
Werde es mal testen.
------
Funktioniert leider nicht.. Danke.

langsam nervt Delphi nur noch
Ein einfaches MoveMemory oder auch CopyMemory ist das gleiche!
Delphi-Quellcode:
    
for K := 0 to g_Prop[gP].Ordersize do
begin
  MoveMemory(@Item, g_Prop[gP].order + K * sizeof(short), sizeof(short));
funktioniert nicht einmal.
Das Item sollte eigentlich inkrementieren tut es aber nicht.

Das will der Compiler auch nicht.
Ich verwende hier FillChar anstelle von FillMemory auch hier das gleiche spielt also keine rolle was ich verwende
um den Speicher mit nullen zu füllen.

Delphi-Quellcode:
buffer: array [0 .. 2047] of Char;
....
FillChar(buffer, sizeof(buffer), 0);
for K := 0 to Count do
  MoveMemory(@buffer[0] + K * sizeof(Short), @A2[K], sizeof(Short));
Zitat:
[DCC Fehler] uSpriteContainer.pas(2656): E2015 Operator ist auf diesen Operandentyp nicht anwendbar
@buffer[0] + K * sizeof(Short)
Das sind doch ganz einfache primitive API calls.
Und müssten eigentlich überall gleich funktionieren.

Ein char bleibt ein char egal ob in c++ oder Delphi, ein Array bleibt ein Array.
Warum macht der Compiler unter Delphi so einen Aufstand.

Und ja short ist SmallInt spielt also keine rolle ob ich es direkt eingebe oder short verwende.
Daran dürfte es nicht scheitern.

Zitat:
SHORT = Smallint;
{$EXTERNALSYM SHORT}

gruss

Geändert von EWeiss (23. Nov 2017 um 06:22 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

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

AW: 2 Arrays vergleichen\sortieren

  Alt 23. Nov 2017, 09:58
MoveMemory(@buffer[0] + K * sizeof(Short), @A2[K], sizeof(Short));
Zitat:
[DCC Fehler] uSpriteContainer.pas(2656): E2015 Operator ist auf diesen Operandentyp nicht anwendbar
@buffer[0] + K * sizeof(Short)
Dort versuchst du auch einen Pointer und einen Integer zu addieren. Probier mal PByte(@buffer[0]) + K * sizeof(Short) . Wenn das nicht geht, dann Pointer(NativeUInt(@buffer[0]) + K * sizeof(Short)) .
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:19 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-2025 by Thomas Breitkreuz