Announcement

Collapse
No announcement yet.

Integer als Bits auswerten (ev. mit TBits)

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Integer als Bits auswerten (ev. mit TBits)

    HI Leute,
    ich habe ein triviales Problem:
    Ich benötige für steuerungszwecke die bitweise Auswertung eines Integer-bzw. Byte-Parameters. Delphi hat dafür sogar ein Objekt Namens TBits. Leider gelingt es mir nicht diesem Objekt mit einer simplen Konstruktion etwas sinvolles zuzuweisen.

    wie z.B.:

    Parameter : TBits
    Wert, i: Integer
    ...

    Wert := 1;

    Parameter := TBits(Wert); (Parameter := Wert geht nicht)

    if Paramereter.Bits[i] = true then ...

    Ich wollte mir das Leben nicht zu schwer machen, aber offensichtlich verursacht die Aufgabe ein Black-Out, oder ?

    Kann mich jemand wieder wachrütteln ??

    Danke Andreas

  • #2
    Mit Tbits habe ich noch nie was gemacht. Mahce es doch einfach über den shl Operator.
    <pre>
    function IsBitGesetzt(Value: integer;Bit:Byte): Boolean;
    begin
    Result := Value and (1 shl Bit) <> 0;
    end;

    </pre&gt

    Comment


    • #3
      Hi Andreas,
      <br>
      du kannst's auch so ähnlich machen:
      <pre>
      <code><font size=2 face="Courier New"><font color="#000000"><b>type
      </b>TMyFlag = (mf0, mf1, mf2, mf3, mf4);
      TMyFlags = <b>set of </b>TMyFlag;
      TBlubb = <font color="#0000FF">0</font>..<font color="#0000FF">31</font>;
      TBlubbSet = <b>set of </b>TBlubb;
      <br><br>
      <b>procedure </b>TForm1.FormCreate(Sender: TObject);
      <b>var
      </b>bits: Cardinal;
      flags: TMyFlags <b>absolute </b>bits;
      flags2: TBlubbSet <b>absolute </b>bits;
      <b>begin
      </b>bits := (<font color="#0000FF">1 </font><b>shl </b><font color="#0000FF">2</font>) <b>or </b>(<font color="#0000FF">1 </font><b>shl </b><font color="#0000FF">5</font>);
      <font color="#008000"><i>// hier flags oder flags2 benutzen</i></font>
      <b>end</b>;
      </font></font>
      </code></pre>
      Du musst halt aufpassen, dass der Typ, aus dem du dein Set baust (also TMyFlag oder TBlubb im Bsp.),
      nicht mehr als 32 Elemente hat, weil ein Integer nun mal nur 32 Bits hat.
      (Und kuck dir mal im Debugger an, was aus dem "1 shl 5" in "flags"
      wird. ;-))
      <br>Ciao, Uli

      Comment


      • #4
        wie waere es mit der Jedi Code Library? http://delphi-jedi.org/CODELIBJC

        Comment


        • #5
          Mein Arbeitskollege nörgelt grad rum, dass mein Beitrag mehr verwirrt als erhellt. ;-)
          <br>Also noch mal: Der Knackpunkt ist, den Integer-Parameter als Pascal-Set zu interpretieren.
          <p>Das geht leider i.a. nicht per Cast, weil eine Variable eines Settyps nicht unbedingt 32 Bit belegt, und der Delphi-Compiler
          nur Casts zwischen Typen gleicher Größe mag. Deshalb hab ich hier
          "absolute" verwendet (&lt;watsche&gt;schlimmer als "goto"!&lt;/watsche&gt. Da könnte man vielleicht auch mit $MINENUMSIZE was drehen -- hab ich aber nicht ausprobiert.
          <p>Uli

          Comment


          • #6
            Danke Frank, ich bin wach !
            Ich dachte es mir schon, dass es eine simple Lösung geben muß.
            Aber das sie sooo simple ist..

            ;-)

            Das TBits ist ausserdem irgendwie nicht greifbar. Jeglicher Zugriff endet mit "priviligierter Zugriff .." o.ä

            Comment


            • #7
              Der Zugriff geht schief, weil du in der Zeile <pre>
              Parameter := TBits(Wert);
              </pre> einen Integer in ein TBits-Variable castet, die aber
              in "Wirklichkeit" nur ein <b>Zeiger</b> auf die echte Instanz ist,
              die Delphi vor uns Programmierern "versteckt". Und dort, wo dein gecasteter Integer hinzeigt, wird eher selten eine solche Instanz rumliegen. ;-)
              <br>Uli

              Comment


              • #8
                Hi Uli,
                danke, Deine Lösung hat in der Tat etwas länger gedauert bis sie bei mir durchgesackt ist, da ich bisher noch nicht so oft mit so einer Konstruktion wie "absolute" konfrontiert wurde. Nicht schlecht für die grauen Zellen. ;-)
                Für meine Zwecke reicht aber die kleine Funktion vom Frank, da mein Integerwert nicht größer als 99 wird.

                Danke nochmals,
                Andrea

                Comment


                • #9
                  Hi Uli,

                  >Parameter := TBits(Wert); <

                  die Konstruktion habe ich ja schon in den Koffer getreten, weil sie mir selber suspect war.

                  Aber jetzt bin ich auf den Geschmack gekommen: Wie fülle ich das TBits, wenn ich es nicht kriege?

                  Ich hatte vorhin folgenden Code:

                  ..
                  myBit: TBits;
                  ..

                  Die Anweisung:
                  myBit.Bit[0]:= true; bringt "priviligierter Zugriff"

                  also, dachte ich, hab ich was nicht erzeugt:
                  myBit.create; -> bringt Zugriffsverletzung bei Adresse xy, wohl doch nicht nötig ??
                  myBit.openbit; -> bringt Zugriffsverletzung bei Adresse FFFFFFF; also ist keiner zu Hause

                  was nun? Für wen oder was gibt es dann das TBits?

                  Eine Frage, die wir wohl heute nicht mehr klären.

                  Ciao Andrea

                  Comment


                  • #10
                    <pre>

                    Bits := TBits.Create;
                    try

                    finally
                    Bits.Free;
                    end;

                    </pre&gt

                    Comment


                    • #11
                      Hagen,
                      schlicht: Danke.
                      Irgenwie stand ich wohl doch neben den Schuhen.

                      Andrea

                      Comment

                      Working...
                      X