Set in LongInt wandeln

06/07/2008 - 16:45 von Michael Fuchs | Report spam
Hallo,

ich möchte ein Set in einen LongInt konvertieren um es dann in einer
sqlite Datenbank zu speichern. Leider funktioniert meine Idee nicht so ganz:

program SetTest;
type
ETest = (Eins=1, Zwei=2, Vier=4, Acht=8);
TestSet = set of ETest;
var
ts: TestSet;
begin
WriteLn(LongInt(ts));
Include(ts, Zwei);
WriteLn(LongInt(ts));
Include(ts, Vier);
WriteLn(LongInt(ts));
end.

Ich hatte die Hoffnung, dass das Testprogramm dann die Ausgabe
0
2
6
auf den Bildschirm schreiben würde, stattdessen ist es aber
0
4
20

So einfach ist es also nicht. Hat da jemand eine bessere Idee?

mfg
Micha
Meine Wanderungen durch Realitàt und Cyberspace

auf --> http://www.michael-fuchs.net <--
 

Lesen sie die antworten

#1 Sieghard Schicktanz
06/07/2008 - 22:24 | Warnen spam
Hallo Michael,

Du schriebst am Sun, 06 Jul 2008 16:45:09 +0200:

ich möchte ein Set in einen LongInt konvertieren um es dann in einer
sqlite Datenbank zu speichern. Leider funktioniert meine Idee nicht so
ganz:



Eigentlich schon...

program SetTest;
type
ETest = (Eins=1, Zwei=2, Vier=4, Acht=8);



Du benutzt also FPC - das kann diese C-artige Syntax.
Du definierst Dir hier einen Aufzàhlungstyp mit Lücken.
(Normalerweise werden den Set-Elementen die Werte beginnend mit 0 der
normalen Zàhlfolge nach zugewiesen.)

TestSet = set of ETest;
var
ts: TestSet;
begin
WriteLn(LongInt(ts));



Hier ist "ts" _eigentlich_ nicht definiert! Lediglich dadurch, daß es eine
_globale_ Variable ist, ist eine Initialisierung gegeben.

Include(ts, Zwei);



"Zwei" setzt also das Bit Nummer 2 wie definiert.

WriteLn(LongInt(ts));



Das wird hier als numerischer Wert ausgegeben, und weil FPC die Bits von 0
weg zuordnet, wird das der numerische Wert 2^2 = 4.

Include(ts, Vier);



Hier wird das Bit Nummer 4 dazugesetzt.

WriteLn(LongInt(ts));



Und damit der numerische Wert für die Ausgabe gebildet:
2^2+ 2^4 = 4+ 16 = 20.

end.

Ich hatte die Hoffnung, dass das Testprogramm dann die Ausgabe
0
2
6



Die Hoffnung wohl schon, aber Du hast einiges dazu gemacht, daß die nicht
erfüllbar ist.

auf den Bildschirm schreiben würde, stattdessen ist es aber
0
4
20



Ja, richtig, so muß es auch sein.

So einfach ist es also nicht. Hat da jemand eine bessere Idee?



Die Grundidee ist schon in Ordnung, nur Deine Vorstellung, wie die Sets in
FPC funktionieren, ist noch nicht ganz vollstàndig. Am besten liest Du Dir
erstmal die Dokumentation dazu durch (ref.pdf, Types - Structured Types -
Set types). Ein gutes Verstàndnis des binàren Zahlensystems könnte auch
hilfreich sein.

Meine Wanderungen durch Realitàt und Cyberspace



Bleib' erstmal bisserl in der Realitàt...


BTW: Wenn Du den Compiler nicht so gegàngelt hàttest, indem Du ihm die
Zuordnung der Bits zu den Set-Elementen selber bestimmen hàttest lassen,
dann wàre Deine Hoffnung sogar schön aufgegangen.
Dann hàtte nàmlich das Element "Zwei" das Bit 1 bekommen, das Element
"Vier" das Bit 2, und damit der letzte Set mit Inhalt { Zwei, Vier } den
àquivalenten numerischen Wert 2^1+ 2^2 = 2+ 4 = 6, wie von Dir erwartet...

-
(Weitergabe von Adressdaten, Telefonnummern u.à. ohne Zustimmung
nicht gestattet, ebenso Zusendung von Werbung oder àhnlichem)
Mit freundlichen Grüßen, S. Schicktanz

Ähnliche fragen