![]() |
TArray welches TPair<> enthält sortieren
Hallo,
warum mag mich der COmpiler hier nicht bzw. was muss ich ändern?
Delphi-Quellcode:
Er wirft einen E2018: Record, Objekt oder Kalssentyp erforderlich Fehler direkt
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; 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 |
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)); |
AW: TArray welches TPair<> enthält sortieren
Seit wann hat ein
Delphi-Quellcode:
eine Sort-Methode?
TArray<T>
Vielleicht solltest du
Delphi-Quellcode:
verwenden, wie Frank bereits bemerkte.
TArray.Sort<T>
|
AW: TArray welches TPair<> enthält sortieren
Himitsu's Variante funktioniert. Danke! Habe übersehen, dass das eine Klassenmethode ist.
|
AW: TArray welches TPair<> enthält sortieren
Nicht nur das. Es sind zwei verschiedene Typen.
System.Generics.Collections:
Delphi-Quellcode:
mit den Klassenmethoden<T>
TArray = class
System:
Delphi-Quellcode:
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/...)
TArray<T> = array of T;
Einen ClassHelper RecordHelper für Arrays funktioniert inzwischen, aber nicht in der generischen Variante.
Delphi-Quellcode:
Und das kompiliert zwar, geht aber auf den falschen Typen.
type
TArrayHelper<T> = record helper for TArray<T> // [dcc32 Fehler] E2508 Typparameter sind bei diesem Typ nicht erlaubt procedure Sort; end;
Delphi-Quellcode:
Wenn du sowas haben willst, mußt du es also selber implementieren, für jeden einzelnen Typen.
TArrayHelper = class helper for TArray
procedure Sort<T>; end;
Delphi-Quellcode:
Und die Klassenvervollständigung kannst du auch vergessen, weil sie immernoch beim < abraucht.
type
TByteArrayHelper = record helper for TArray<Byte> procedure Sort; end; var A: TArray<Byte>; begin A.Sort; 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