![]() |
Variablenwert Bestandteil einer Menge ? wie Zeitkritisch ???
hallo leute!
ich hab mal wieder ein problem also: ich hab verschiedene Mengen, die asciicodes von zeichen als dezimalwerte enthalten. z. B.
Delphi-Quellcode:
teste jetz in einer for next schleife mit einer if abfrage , ob ein variablenwert x, in der menge enthalten ist
test = set of byte;
test:=96,97,98 steht für a,b,c laut ascii tabelle was ist nun aber , wenn die mengen größer werden, sagen wir mal 255 werte? wuerde das die ausführungszeit meiner for next schleife nachhaltig beeinflussen (wenn das ganze ne sekunde dauert, kann ich das vergessen,da ich die for next zur bildschirmausgabe nutze, und eine stringgrid mit daten fuettere) PS: waehre nett, wenn mir jemand mal, die codepages für intels little und big-endian, macintosh, Ebcdic und asci 7 bit zukommen lassen koennte danke schon mal im vorraus :) |
Re: Variablenwert Bestandteil einer Menge ? wie Zeitkritisch
Sets duerfen nur 256 Elemente haben und der Test ist einfach eine Bitverknuepfung, also sehr effizient.
|
Re: Variablenwert Bestandteil einer Menge ? wie Zeitkritisch
Danke Robert,
hab es einfach mal probiert, und es läuft super. eine frage haett ich noch ich hab jetz meine menge folgendermaßen deklariert:
Delphi-Quellcode:
ich will aber das entsprechende set dynamisch auswaehlen koennen.
var
charset1,charset2,charset3 : set of byte; i:integer; ... begin i:=1; // aktuelles charset setzen charset1 := [46..255]; charset2 := [46..200]; charset3 := [21..255]; geht das so ???
Delphi-Quellcode:
ich bekomme immer ne meldung inkompatible typen,damit weis ich nix anzufangen
if x in charset[i] then bla,blab,bla...
|
Re: Variablenwert Bestandteil einer Menge ? wie Zeitkritisch
Hai Richard,
ungetestet:
Delphi-Quellcode:
var
aktcharset : set of byte; charset1,charset2,charset3 : set of byte; i:integer; ... begin i:=1; // aktuelles charset setzen charset1 := [46..255]; charset2 := [46..200]; charset3 := [21..255]; case i of 1 : aktcharset := charset1; 2 : aktcharset := charset2; 3 : aktcharset := charset3; end; if x in aktcharset then bla,blab,bla... |
Re: Variablenwert Bestandteil einer Menge ? wie Zeitkritisch
Hallo richard_boderich,
wenn ich Dich richtig verstehe, ist Deine Variable x ein Char und Deine Sets Mengen vom Typ Byte. Wusstest Du, dass Du Sets auch vom Typ Char anlegen kannst um Konstrukte der Art
Delphi-Quellcode:
zu realisieren?
var
myChar: Char; myLetters: Set of Char; myDigitsAndOperators: Set of Char; begin myChar := ObtainAChar; myLetters := ['A'..'Z']; myDigitsAndOperators := ['0'..'9', '+', '-', '/', '*']; if myChar in myLetters then DoSth(myChar) else if myChar in myDigitsAndOperators then DoSthElse(myChar, ASecondParameter) else DoDefaultBehavior; end; Solche Sets können selbstverständlich auch zur Laufzeit berechnet werden (siehe auch OH zu Include, Exclude), zB so
Delphi-Quellcode:
Wenn die Sets hingegen, wie in meinem ersten Beispiel, fest sind, könntest Du auch eine einfache Case-Anweisung verwenden:
type
TCharSet = set of Char; function AdditionalChars: TCharSet; begin Result := [ObtainAChar]; end; //... begin myLetters := ['A'..'Z'] + AdditionalChars;
Delphi-Quellcode:
case myChar of
'A'..'Z': DoSth(myChar); '0'..'9', '+', '-', '/', '*': DoSthElse(myChar, ASecondParameter); else DoDefaultBehavior; end; |
Re: Variablenwert Bestandteil einer Menge ? wie Zeitkritisch
Oder gleich so:
Delphi-Quellcode:
var
charset : Array of set of byte; i:integer; begin i:=0; // aktuelles charset setzen charset[0] := [46..255]; charset[1] := [46..200]; charset[2] := [21..255]; if x in charset[i] then bla,blab,bla... |
Re: Variablenwert Bestandteil einer Menge ? wie Zeitkritisch
@choose ,
ne ,das haste wat falsch verstanden, x ist eine dezimaler bytewert z.b. 245. ich muss testen ob dieser wert in der aktuellen menge vorkommt ich weis das ich auch solche charsets anlegen kann 'a','b', 'c' usw. aber definiere da mal die ganzen sonderzeichen, da wird es dann schon eng (schau dir mal die ascii tabelle an) deswegen nehm ich die bytewerte und wandel sie zu laufzeit in chars das, das berechnen von sets zur laufzeit moeglich ist , wusst ich noch nich, wirklich faszinierend :stupid: , danke hab wiederwas dazugelernt :idea: aber trotzdem many thank's @chewie, deine loesung sieht supi aus,kurz und geradlinieg, scheinen aehnlich zu denken, meine code war fast genauso werd ich ma testen :) thanks meine loesung war:
Delphi-Quellcode:
hatt aber nicht funktioniert, weis jemand wieso charset hab ich doch als dynamische oder indexvariable angesrochen?
charset1,charset2,charset3 : set of byte;
i:integer; begin i:=0; // aktuelles charset setzen charset[0] := [46..255]; charset[1] := [46..200]; charset[2] := [21..255]; if x in charset[i] then bla,blab,bla... will aber verstehen wo mein fehler war, denke mal das deplhi indexvariablen anders kennzeichnet im syntax oder ? |
Re: Variablenwert Bestandteil einer Menge ? wie Zeitkritisch
@chewie,
deine loesung funzt nich, bekomme eine exeption bei der zuweisung der setwerte
Delphi-Quellcode:
var
charset: array of set of byte; ... begin charset[0] := [46..255]; <- exeption charset[1] := [46..200]; charset[2] := [21..255]; |
Re: Variablenwert Bestandteil einer Menge ? wie Zeitkritisch
Zitat:
Delphi-Quellcode:
und ersparst damit den Cast von Char zu Byte und umgekehrt. Insgesamt also wesentlich übersichtlicher und ggf sicherer durch die Typenstrenge...
myLetters := [#65..#67, 'D'..'E']; // eq ['A'..'E'];
EDIT: Selbiges gilt selbstverständlich auch für die Lösung via Case |
Re: Variablenwert Bestandteil einer Menge ? wie Zeitkritisch
@chewie,
deine loesung funzt nich, bekomme eine exeption bei der zuweisung der setwerte
Delphi-Quellcode:
var
charset: array of set of byte; ... begin charset[0] := [46..255]; <- exeption charset[1] := [46..200]; charset[2] := [21..255]; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:30 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