Autor Beitrag
mars
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 238

Debian Woody, Win 2000, Win XP
D7 Ent, Kylix 3
BeitragVerfasst: Di 25.03.03 14:56 
Gibt es eine Funktion, welche den maximalen Wert eines Sets zurückgibt?
DiV
maximus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Di 25.03.03 15: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

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 238

Debian Woody, Win 2000, Win XP
D7 Ent, Kylix 3
BeitragVerfasst: Di 25.03.03 15: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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Di 25.03.03 15:52 
In deinem fall kannst du mein beispiel nicht verwenden, da solche sets keine TypeInfo haben!

Was hällst du von
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 238

Debian Woody, Win 2000, Win XP
D7 Ent, Kylix 3
BeitragVerfasst: Di 25.03.03 16:01 
Hä?!?
maximus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Di 25.03.03 16: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Di 25.03.03 16: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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 238

Debian Woody, Win 2000, Win XP
D7 Ent, Kylix 3
BeitragVerfasst: Di 25.03.03 17: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Di 25.03.03 17: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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 238

Debian Woody, Win 2000, Win XP
D7 Ent, Kylix 3
BeitragVerfasst: Di 25.03.03 18: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Di 25.03.03 21: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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 238

Debian Woody, Win 2000, Win XP
D7 Ent, Kylix 3
BeitragVerfasst: Di 25.03.03 21:58 
Ja, ok, wenn es nichts anderes gibt, werd ich s wohl auf die unästhetische Art lösen müssen
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Mi 26.03.03 10:06 
Wie wäre es denn mit den Funktionen High und Low?

Zum Beispiel so:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 238

Debian Woody, Win 2000, Win XP
D7 Ent, Kylix 3
BeitragVerfasst: Mi 26.03.03 10: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Mi 26.03.03 10:50 
Tino hat folgendes geschrieben:
Wie wäre es denn mit den Funktionen High und Low?

Zum Beispiel so:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Mi 26.03.03 11:16 
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