AGB  ·  Datenschutz  ·  Impressum  







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

TArray welches TPair<> enthält sortieren

Ein Thema von TurboMagic · begonnen am 26. Sep 2022 · letzter Beitrag vom 27. Sep 2022
Antwort Antwort
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.942 Beiträge
 
Delphi 12 Athens
 
#1

TArray welches TPair<> enthält sortieren

  Alt 26. Sep 2022, 16:21
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.062 Beiträge
 
Delphi 12 Athens
 
#2

AW: TArray welches TPair<> enthält sortieren

  Alt 26. Sep 2022, 16:35
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));
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: TArray welches TPair<> enthält sortieren

  Alt 26. Sep 2022, 16:57
Seit wann hat ein TArray<T> eine Sort-Methode?

Vielleicht solltest du TArray.Sort<T> verwenden, wie Frank bereits bemerkte.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.942 Beiträge
 
Delphi 12 Athens
 
#4

AW: TArray welches TPair<> enthält sortieren

  Alt 27. Sep 2022, 08:57
Himitsu's Variante funktioniert. Danke! Habe übersehen, dass das eine Klassenmethode ist.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.062 Beiträge
 
Delphi 12 Athens
 
#5

AW: TArray welches TPair<> enthält sortieren

  Alt 27. Sep 2022, 09:59
Nicht nur das. Es sind zwei verschiedene Typen.

System.Generics.Collections: TArray = class mit den Klassenmethoden<T>
System: 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)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (27. Sep 2022 um 10:34 Uhr)
  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:34 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz