Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Bit Byte und shr (https://www.delphipraxis.net/3261-bit-byte-und-shr.html)

Daniel B 3. Mär 2003 21:58


Bit Byte und shr
 
Hallöchen,

komm gerade nicht mit dem Bit-Shiften weiter.
Delphi-Quellcode:
var
  sCom: String;
begin
  repeat
    STC(#113#0);
    STC(#106);
    ComPort1.ReadStr(sCom, 2);
    Application.ProcessMessages;
  until
    ((sCom[1] = #106) and (sCom[2] >= Char(32))); ***
  begin
    BitBtnLesen.Enabled := True;
    BitBtnSchreiben.Enabled := True;
  end;
end;
Es geht um die zeile mit dem ***.
Und zwar hab ich mir folgendes vorgestellt:
Delphi-Quellcode:
((sCom[1] = #106) and (sCom[2] shr 32));
So klappt es nicht.
"[Fehler] Unit1.pas(248): Operator ist auf diesen Operandentyp nicht anwendbar"

Grüsse, Daniel :hi:

nailor 3. Mär 2003 22:20

Code:
(sCom[1] = #106)
müsste einen boolean geben.

Code:
(sCom[2] shr 32)
ein Byte.

Daniel B 3. Mär 2003 22:24

Hallo,

das bringt mir nichts. Ich lese zwei Bytes. Das erste Byte ist #106 und im zweiten Byte muss ich nachsehen ob das 6te Bit eine 1 ist.

Grüsse, Daniel :hi:

nailor 3. Mär 2003 22:34

Delphi-Quellcode:
until ((byte1 = #106) and ((byte2 and #64 {müsste das sechste bit sein}) = # 64))
testet, ob byte eins 106 ist, und ob im zweiten das sechste bit gesetzt ist. Falls du das meinst.

Daniel B 3. Mär 2003 22:37

Zitat:

Zitat von Nailor
Delphi-Quellcode:
until ((byte1 = #106) and ((byte2 and #64 {müsste das sechste bit sein}) = # 64))
testet, ob byte eins 106 ist, und ob im zweiten das sechste bit gesetzt ist. Falls du das meinst.

Das ist ja im prinzip das gleiche wie:
Delphi-Quellcode:
((sCom[1] = #106) and (sCom[2] >= {Char(32)} #32));
Nur mit dem Unterschied, ich schaue ob der Wert des zweiten Bytes >= 32 ist. Den 32 ist Bit 6.

Grüsse, Daniel :hi:

nailor 3. Mär 2003 22:42

a) ist das ">=" falsch, dann kann ja auch nur das siebte gesetzt sein, du bräuchtest ein "="

b) gibt die erste Aktion (logical Operator) einen boolean, die zweite (bitwise Operation) ein bit. Danach macht das and in der Mitte einen Aufstand, weil schlecht

Delphi-Quellcode:
if true and #27
zu einem vernünftigen Ergebnis führen kann. Bei meiner Version sind beides booleans, und es sollte gehen.

Daniel B 3. Mär 2003 22:45

((sCom[1] = #106) and ((sCom[2] and #32) = #32));

Bringt gleichen Fehler wie anfangs.

Grüsse, Daniel :hi:

nailor 3. Mär 2003 22:51

Bei der rechten Hälfte musst du die "#" weglassen. Das "and" verlangt nach Integern.

Delphi-Quellcode:
if ((#106 = #106) and ((33 and 32) = 32)) then close; //beendet das Programm. Wurde von mir getestet und läuft!

jbg 3. Mär 2003 22:53

Delphi-Quellcode:
if ((sCom[1] = #106) and ((Byte(sCom[2]) and 32) <> 0)) then
Funktioniert. Man muss den Char nur in ein Byte typecasten. Das "<>0" anstatt dem "=32" spart ein klein wenig rechenzeit, da die interne Substraktion entfällt.

Daniel B 3. Mär 2003 22:56

Zitat:

Zitat von jbg
Delphi-Quellcode:
if ((sCom[1] = #106) and ((Byte(sCom[2]) and 32) <> 0)) then
Funktioniert. Man muss den Char nur in ein Byte typecasten. Das "<>0" anstatt dem "=32" spart ein klein wenig rechenzeit, da die interne Substraktion entfällt.

Danke Dir, klappt wunderbar. Auch an Nailor Danke!!

Grüsse, Daniel :hi:


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:14 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz