![]() |
Set of - Warum kein Compiler-Fehler?
Hi,
folgender Code (vereinfacht):
Delphi-Quellcode:
Wenn ich jetzt folgenden Aufruf durchführe:
type
TElement = (Wert1, Wert2, Wert3, Wert4, Wert5); TElemente1 = set of Wert2..Wert4; TElemente2 = set of TElement; {...} procedure Irgendwas(Wert: TElemente1); begin //... end;
Delphi-Quellcode:
gibt es keine Fehlermeldung.
Irgendwas( [Wert1, Wert2] );
Warum nicht? Wert1 ist doch gar nicht in TElemente1 enthalten... Wie kann ich das Problem lösen, ohne einen zweiten Typ TElement zu definieren ? |
Re: Set of - Warum kein Compiler-Fehler?
Hallo Martin,
wieso es hier keinen Fehler beim Kompilieren gibt, weiß ich auch nicht. Scheint ihm egal zu sein :roll: Im Moment wüsste ich nur, wie du falsche Übergabeparameter zur Laufzeit abfängst:
Delphi-Quellcode:
Viele Grüße,
procedure Irgendwas(Wert: TElemente1);
var SmallSet : TElemente1; begin SmallSet := [Wert2..Wert4]; Assert((Wert - SmallSet) = [], 'Internal Error'); ShowMessage('Hallo'); end; pszopp |
Re: Set of - Warum kein Compiler-Fehler?
Sets sind nur verpackte Bitfelder (Wert1 = 1, wert2 = 2, Wert3 = 8 usw.). Ob nun das Bit, das du setzt, überhaupt eine Konstante des Sets ist oder nicht, ist ihm egal. Du kannst ihm auch TElemente2(65) zuweisen, das sollte dann [Wert1, "Wert7"] sein.
|
Re: Set of - Warum kein Compiler-Fehler?
Danke, für eure Antworten.
Das mit den Bitfelder war mir schon klar, aber ich dachte bei TElemente1 würde dann Wert2 = 1 sein. Mir ist halt nicht klar, warum das komplette TElement genommen wird und nicht aus Wert2, Wert3, Wert4 ein neues Bitfeld erzeugt wird. |
Re: Set of - Warum kein Compiler-Fehler?
Für den Compiler sind die Werte eben einfach nur Konstanten. Was er parst, ist eigentlich
Delphi-Quellcode:
Weiter denkt der nicht ;) .
TElemente = set of 2..8;
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:44 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