AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Eure Meinung: Syntaxerweiterung Set-Typen auf mehr als 255 Elemente
Thema durchsuchen
Ansicht
Themen-Optionen

Eure Meinung: Syntaxerweiterung Set-Typen auf mehr als 255 Elemente

Ein Thema von Codehunter · begonnen am 25. Jul 2018 · letzter Beitrag vom 25. Aug 2020
 
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.284 Beiträge
 
Delphi 12 Athens
 
#12

AW: Eure Meinung: Syntaxerweiterung Set-Typen auf mehr als 255 Elemente

  Alt 22. Aug 2020, 18:24
Mir ist bewusst dass der Fragende sich hier auf D7 bezog. Dennoch:

Nennt mich Ketzer aber ich löse das bei neueren Delphis inzwischen in etwa so (aus dem Gedächtnis, da kein Delphi zur Hand, deshalb als Pseudocode betrachten)

Delphi-Quellcode:
type
  PBigSetOf = ^TBigSetOf; // Ich arbeite meist mit Zeigern um Speicherkuddelmuddel zu vermeiden
  TBigSetOf = record
    FElements: TArray<word>;
    class operator implicit(A: TBigSetOf): TArray<word>;
    class operator implicit(A: TArray<word>): TBigSetOf;
    class operator in(A: Word, B: TBigSetOf): Boolean;
  end;

implementation

const
  // Für die Erzeugung der Konstanten habe ich mir ein kleines Tool geschrieben
  m0 = 0;
  {...}
  m1024 = 1024;

class operator implicit(A: TBigSetOf): TArray<word>;
begin
  Self.FElements := A.FElements:
  Result := Self.FElements;
end;

class operator implicit(A: TArray<word>): TBigSetOf;
var
  LElement: Word;
begin
  for LElement in A do begin
    if not LElement in Self then begin
      Self.FElements := Self.FElements + [LElement];
    end else begin
      raise // Irgendwas wegen nicht eindeutig
            // deswegen auch der Umweg über einen Record
            // anstatt einfach nur ein array of Word zu benutzen
    end;
  end;
  Result := Self;
end;

class operator in(A: Word, B: TBigSetOf): Boolean;
var
  LElement: Word;
begin
  Result := False;
  for LElement in B.FElements do begin
    if LElement = A then begin
      Result := True;
      Break;
    end;
  end;
end;

procedure Test;
var
  LBigSetOf: TBigSetOf;
begin
  LBigSetOf := [m0, m128, m256, m512, m1024];
  if m96 in LBigSetOf then begin
    // Nein
  end else if m512 in LBigSetOf then begin
    // Ja
  end;
end;
Die Performance kommt mit Sicherheit nicht an set of heran, kommt daher auf den Einzelfall an. In meinem Fall sind die implicit-Operatoren deutlich umfangreicher, weshalb die Prüfung auf Eindeutigkeit wichtig ist.
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
 


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 09:01 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