Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   TArray welches TPair<> enthält sortieren (https://www.delphipraxis.net/211507-tarray-welches-tpair-enthaelt-sortieren.html)

TurboMagic 26. Sep 2022 16:21

TArray welches TPair<> enthält sortieren
 
Hallo,

warum mag mich der COmpiler hier nicht bzw. was muss ich ändern?

Delphi-Quellcode:
type
  TFailureEntry = TPair<System.Word, TMyFailureRecord>;

procedure TMyClass.GetFailureAbbreviations;
var
  FailureArray: TArray<TFailureEntry>;
  Comparison: TComparison<TFailureEntry>;
begin
  // derrive the array contents from a dictionary
  FailureArray := FFailureDictionary.ToArray;

  Comparison :=
    function(const Left, Right: TFailureEntry): Integer
    begin
      Result := Left.Key-Right.Key;
    end;

  FailureArray.Sort(TComparer<TFailureEntry>.Construct(Comparison));
end;
Er wirft einen E2018: Record, Objekt oder Kalssentyp erforderlich Fehler direkt
am Sort Aufruf. Der Construct Aufruf als solches scheint noch zu funktionieren,
ziehe ich TComparer<TFailureEntry>.Construct(Comparison); raus compiliert das noch,
bleibt aber wieder am Sort "hängen".

Grüße
TurboMagic

himitsu 26. Sep 2022 16:35

AW: TArray welches TPair<> enthält sortieren
 
Was bleibt am Sort wie hängen?

sowas wie "[dcc32 Fehler] E2018 Record, Objekt oder Klassentyp erforderlich" aka "sort nicht gefunden" ?



Delphi-Quellcode:
TArray.Sort<TFailureEntry>(FailureArray, TComparer<TFailureEntry>.Construct(Comparison));

// oder wenn man brutal ist, auch ohne zwischentyp
TArray.Sort<TPair<System.Word,TMyFailureRecord>>(FailureArray, TComparer<TPair<System.Word,TMyFailureRecord>>.Construct(Comparison));

Uwe Raabe 26. Sep 2022 16:57

AW: TArray welches TPair<> enthält sortieren
 
Seit wann hat ein
Delphi-Quellcode:
TArray<T>
eine Sort-Methode?

Vielleicht solltest du
Delphi-Quellcode:
TArray.Sort<T>
verwenden, wie Frank bereits bemerkte.

TurboMagic 27. Sep 2022 08:57

AW: TArray welches TPair<> enthält sortieren
 
Himitsu's Variante funktioniert. Danke! Habe übersehen, dass das eine Klassenmethode ist.

himitsu 27. Sep 2022 09:59

AW: TArray welches TPair<> enthält sortieren
 
Nicht nur das. Es sind zwei verschiedene Typen.

System.Generics.Collections:
Delphi-Quellcode:
TArray = class
mit den Klassenmethoden<T>
System:
Delphi-Quellcode:
TArray<T> = array of T;
ohne irgendwas (Gut, ein Sortierungscode in System ist vielleicht zuviel, aber dann eben den Typen einfach in eine andere Unit, als TSortedArray<T> TManagedArray<T> mit Find/Exists/Sort/Pop/Push/Shift/Move/...)

Einen ClassHelper RecordHelper für Arrays funktioniert inzwischen,
aber nicht in der generischen Variante.
Delphi-Quellcode:
type
  TArrayHelper<T> = record helper for TArray<T> // [dcc32 Fehler] E2508 Typparameter sind bei diesem Typ nicht erlaubt
    procedure Sort;
  end;
Und das kompiliert zwar, geht aber auf den falschen Typen.
Delphi-Quellcode:
  TArrayHelper = class helper for TArray
    procedure Sort<T>;
  end;
Wenn du sowas haben willst, mußt du es also selber implementieren, für jeden einzelnen Typen.
Delphi-Quellcode:
type
  TByteArrayHelper = record helper for TArray<Byte>
    procedure Sort;
  end;

var
  A: TArray<Byte>;
begin
  A.Sort;
Und die Klassenvervollständigung kannst du auch vergessen, weil sie immernoch beim < abraucht.

Bestimmt kann man noch durch Vererbung oder einen Dummyklasse bissl gemeinsamen Code zentralisieren
und es über ein Code-LiveTemplate bereitstellen.



[add]
Oder ein Record, der sich wie ein Array verhält.

Wenn du noch bis zum Wochenende warten kannst ... ich bastle mir eh grade was, da das threadsave von Emba garnicht wirklich threadsave ist (seit jahren ignorierte Bugs und ich hab einen Anwendungsfall, wo sekündlich mehrere hundert Aktionen sicher nötig wären)
und das sonst passendende zwar ginge, aber von Haus aus nicht als thradsave implementiert ist.

(das was ich weglassen wollte, weil für mich nicht nicht nötig, wäre nicht der große Mehraufwand)


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:46 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