Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Max(Set)
mars - Di 25.03.03 15:56
Titel: Max(Set)
Gibt es eine Funktion, welche den maximalen Wert eines Sets zurückgibt?
DiV
maximus - Di 25.03.03 16:20
HiLo.
So eine funktion hab ich noch nicht gesehen...soll nicht heissen das es sie nicht gibt! Aber du kannst den maximalen wert des zugehörigen enum-types ermitteln, was wiederum auch der max-wert für ein set..da in einem set sämtlich bits nur einmal auftauchen können :D
Quelltext
1: 2: 3: 4: 5: 6: 7:
| TX = (tx1, tx2, tx3); TXset = set of TX; ... uses typInfo; ... i := GetTypeData(TypeInfo(TX)).MaxValue; ShowMessage( IntToStr(i)) |
so würde ich es machen...möglicherweise kennt jemand eine coolere möglichkeit!
mfg. mx.
mars - Di 25.03.03 16:37
Nun, danke mal für deinen Post. Doch ich habe Mühe, dein Beispiel auf meine konkrete Situation zu übertragen. Auch findet meine OH die Funktion GetTypeData nicht. Könntest du mir noch sagen, wie ich es bei mir lösen sollte:
Quelltext
1: 2: 3: 4: 5: 6:
| Irgendwas=set of 1..250;
var irgend: Irgendwas;
irgend:= [a,b,c]; |
Wie bekomme ich nun den grössten Wert von irgend?
Danke
maximus - Di 25.03.03 16:52
In deinem fall kannst du mein beispiel nicht verwenden, da solche sets keine TypeInfo haben!
Was hällst du von
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| const MaxSet = 250;
type Irgendwas=set of 1..MaxSet;
var irgend: Irgendwas;
irgend:= [a,b,c]; i := maxSet ;) |
Müsste den selben effekt haben!?
mars - Di 25.03.03 17:01
Hä?!?
maximus - Di 25.03.03 17:41
Naja...wenn du ein set hast, dass die werte 1 bis 250 haben kann und jeder wert nur einmal in dem set auftauchen darf(das haben sets so ansich), dann ist die maximale anzahl gleich der anzahl der werte -> also 250.
Da du 250 sowieso statisch im code hast, kannst du ihn auch in eine konstante schreiben und als MaxSet benutzen! oder hab ich dich falsch verstanden?
maximus - Di 25.03.03 17:45
| Zitat: |
Wie bekomme ich nun den grössten Wert von irgend?
|
Sach das doch gleich...dein ersten post konnte man auch anders versthen!
| Zitat: |
Gibt es eine Funktion, welche den maximalen Wert eines Sets zurückgibt?
DiV |
Das ist ein kleiner aber feiner unterschied :D
Ich arbeite drann
mars - Di 25.03.03 18:08
Sorry, dass es möglicherweise zweideutig war :wink:
Danke jedenfalls für deine Mühe. Irgendwann möchte ich auch noch begreifen, was deine tricky Methode mit dem GetTypeData(TypeInfo()) sein sollte...
maximus - Di 25.03.03 18:56
@TypeData:
Mit TypeInfo(TX) hol ich mir einem Pointer auf den RTTI(runTimeTypeInfo) eintrag des types TX.
Mit GetTypeData(...) kann ich dann auf die vielen lustigen infos zugreifen, die Delphi für diesen typ gespeichert hat. Zurück kommt ein record vom typ TTypeData. in TTypeData sind infos für alle möglichen daten-und Objekttypen vorhanden. Deshalb sollte man aufpassen, das man nur die infos liest, die für den typ gedacht sind!
Unteranderem zB. für enum typen MinValue und MaxValue!
Also du hast ein enum-typ
TX = (tx1, tx2, tx3);
dann ist das im prinzip das:
TX = (0,1,2);
Hier ist MinValue = 0 und MaxValue = 2 gespeichert!
Da ein SET nur bits sind, die entweder gesetzt sind oder nicht, ist die max.Anzahl = MaxValue!
zB:
Quelltext
1: 2: 3:
| var x:TX; ... x := [tx1,tx3]; |
sieht binär so aus >101< -> das bit 0 und das bit 2 ist gesetzt, also genau die bits, deren bezeichner( siehe prinzip oben) im set stehen!
...
Ich denke dein set sieht auch so aus, nur das du 255 bits hast :)
Hoffe das hat zum verständnis beigetragen!?
mars - Di 25.03.03 19:30
ja, doch! Danke :lol:
Ich denke, RTTI wurde schon in einem anderen Thread erklärt, also werde ich mich mal weiter schlau machen darüber, tönt nämlich interessant... :wink:
maximus - Di 25.03.03 22:50
Zu deinem ursprünglichen prob kann ich momentan nur sagen, dass du es auf die brutale methode machen könntest. Also einfach eine funktion, mit einer for-schleife drinn, die alle für werte testet ob sie im set vorhanden sind. Ist einer vorhanden speicherst du ihn im result und lässt die schleife weiter laufen. Dann sollte der höchste wert zurückgegben werden.
mfg mx
mars - Di 25.03.03 22:58
Ja, ok, wenn es nichts anderes gibt, werd ich s wohl auf die unästhetische Art lösen müssen
Tino - Mi 26.03.03 11:06
Wie wäre es denn mit den Funktionen
High und
Low?
Zum Beispiel so:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| Type tTestId = (idTest1, idTest2, idTest3);
[...]
var Test: tTestId; begin For Test := Low (Test) To High (Test) Do ; end; |
Gruß
Tino
mars - Mi 26.03.03 11:20
Das hat aber nichts mit meiner Frage zu tun, oder doch?
Jedenfalls weiss ich mit deinem Beispiel immer noch nicht, wie ich den höchsten Wert im Set erhalte. :(
maximus - Mi 26.03.03 11:50
| Tino hat folgendes geschrieben: |
Wie wäre es denn mit den Funktionen High und Low?
Zum Beispiel so:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| Type tTestId = (idTest1, idTest2, idTest3);
[...]
var Test: tTestId; begin For Test := Low (Test) To High (Test) Do ; end; |
Gruß
Tino |
Ja...das ist besagte 'coolere' möglichkeit für typData.minValue typData.maxValue. Letztendlich greift dies aber vermutlich auch auf die typ daten zurück! Doch für sets geht das schonmal garnicht!
Tino - Mi 26.03.03 12:16
Titel: Re: Max(Set)
Ich habe dies nur als Beispiel gepostet weil ich mit den ganzen Hinweisen , Mengen- und Aufzählungstypen die hier gepostet worden sind nicht viel anfangen konnte.
Gruß
Tino
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!