Problem mit Bitset

was mach ich falsch, oder ist es der Compiler?

jomixl
Benutzer
Avatar
Gender:
Posts: 225
Registered: 02 / 2008
Subject:

Problem mit Bitset

 · 
Posted: 07.10.2016 - 15:09  ·  #1
Hallo Gemeinde,

ich versuche mich gerade mit einem einfachen Bitset, hab dazu ein kleines Programm angehängt.
Eigentlich würde ich erwarten dass die Variable C alle Werte bis $f durchläuft.

Leider geht sie nur bis 3.

Hat jemand eine Idee was ich hier falsch mache?

Gruß Joachim

Code
ype
// OpFeatures
tBitsOpF = (aa, bb, cc,dd);
tOpF = Bitset of tBitsOpF;


{--------------------------------------------------------------}
{ Const Declarations }

{--------------------------------------------------------------}
{ Var Declarations }
{$IDATA}
var
  OpF              : tOpF;                   // 2

  b,c : byte;
{--------------------------------------------------------------}
{ functions }



{--------------------------------------------------------------}
{ Main Program }
{$IDATA}

begin
  b := 0;
  
  EnableInts($87);

  loop
   inc(b);
   opf := tOpF(b);
  
  if opf = aa then
    c := b;
  endif;
  if opf = bb then
    c := b;
  endif;
  if opf = cc then
    c := b;
  endif;
  if opf = dd then
   c := b;
  endif;


  endloop;
end enumtest.
Attachments
Filename: enumtest.PAS
Filesize: 1.83 KB
Title:
Download counter: 45
rh
Administrator
Avatar
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: Problem mit Bitset

 · 
Posted: 07.10.2016 - 16:17  ·  #2
Hallo.
ein Bitset ist ein neuer Typ, wie z.B. ein Byte.
Wenn man ein Byte inkrementiert ist bei 255 Schluss.
Wenn ein Bitset von 0..3 läuft, dann ist bei INC auch bei 3 Schluss-

rolf
jomixl
Benutzer
Avatar
Gender:
Posts: 225
Registered: 02 / 2008
Subject:

Re: Problem mit Bitset

 · 
Posted: 07.10.2016 - 18:25  ·  #3
Danke für die Antwort,
leider bringt sie mich auch nicht weiter ......

also:
in meinem Bitset sind di Bits aa und cc gesetzt.
wenn ich das bitset in ein Byte konvertire hat es des den Wert 5;
nun würde ich erwarten dass wenn ich die 5 wieder in das Biset konvertiere
dass dann die Bits aa und cc gesetzt werden.

.... oder was hab ich da nicht verstanden ....

Gruß Joachim
Merlin
Administrator
Avatar
Gender:
Age: 24
Posts: 1409
Registered: 03 / 2005
Subject:

Re: Problem mit Bitset

 · 
Posted: 09.10.2016 - 11:44  ·  #4
The problem is with your tests. Opf is a bitset but you are testing it against an enum member. The enum can only ever reach 3, therefore c can only ever reach 3. Your tests should be more like this

Code

  c:= 0;
  if aa in opf then 
    c := c + ord(aa);
  endif; 
  etc..
jomixl
Benutzer
Avatar
Gender:
Posts: 225
Registered: 02 / 2008
Subject:

Re: Problem mit Bitset

 · 
Posted: 10.10.2016 - 10:59  ·  #5
Thanks,
i'm still confused about bitsets/enums but start to understand it ....

Joachim
Merlin
Administrator
Avatar
Gender:
Age: 24
Posts: 1409
Registered: 03 / 2005
Subject:

Re: Problem mit Bitset

 · 
Posted: 10.10.2016 - 11:52  ·  #6
Actually my code was wrong (sorry) and likely to confuse. It should read

Code
 c:= 0; 
  if aa in opf then  
    incl( c, aa); 
  endif;  
  etc.. 


or equivalently

Code
 c:= 0; 
  if aa in opf then  
    c := c + (1 shl aa); 
  endif;  
  etc.. 



But the description of the problem is correct.

Sorry again.
rh
Administrator
Avatar
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: Problem mit Bitset

 · 
Posted: 10.10.2016 - 14:04  ·  #7
Hallo Joachim,

tja, Bitsets sind am Anfang etwas verwirrend aber sehr mächtige
Konstrukte. Dazu gibts ein Beispiel Programm:
BitSets

rolf
jomixl
Benutzer
Avatar
Gender:
Posts: 225
Registered: 02 / 2008
Subject:

Re: Problem mit Bitset

 · 
Posted: 10.10.2016 - 15:52  ·  #8
Hallo Rolf,
hab natürlich das Beispiel auch angeschaut, allerdings war es mir zu Beginn auch sehr schnell zu komplex.
Hab es inzwischen aber soweit am Laufen.

nochmals danke an alle

Gruß Joachim
Selected quotes for multi-quoting:   0

Registered users in this topic

Currently no registered users in this section

The statistic shows who was online during the last 5 minutes. Updated every 90 seconds.
MySQL Queries: 15 · Cache Hits: 15   140   155 · Page-Gen-Time: 0.05525s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI