Was bedeutet ((BYTE_VAL*)(&header.NextPacketPointer))->bits.b0

Gast #1186521
Ich habe folgenden Code aus dem Microchip TCP/IP stack für den ENC28J60:
1
if(header.NextPacketPointer > RXSTOP || ((BYTE_VAL*)(&header.NextPacketPointer))->bits.b0 ||
2
     header.StatusVector.bits.Zero ||
3
     header.StatusVector.bits.CRCError ||
4
     header.StatusVector.bits.ByteCount > 1518u ||
5
     !header.StatusVector.bits.ReceiveOk)
6
  {
7
    Reset();
8
  }

Ich verstehe die bedeutung von diesem vergleich nicht:
1
((BYTE_VAL*)(&header.NextPacketPointer))->bits.b0

Ich vermute hier wird überprüft ob der wert in header.NextPacketPointer 
gerade oder ungerade ist. Ist das so, oder bin ich auf dem Holzweg ?

Gruß aus Köln

Frank
Gast
1
((BYTE_VAL*)(&header.NextPacketPointer))->bits.b0

an sich ist kein Vergleich, sondern ein Wert. Der wird nach C-Konvention 
in einem if-statement als falsch interpretiert, wenn er Null ist, sonst 
als true.

Oliver
Gast
Nachtrag:

((BYTE_VAL*)(&header.NextPacketPointer)) ist (vermutlich) ein Pointer 
auf ein struct vom Typ BYTE_VAL. Dieses enthält (u.a.) eine Variable vom 
Type bit, die wiederum eine Variable Namens b0 enthält. Über den 
Operator -> klärt jedes C-Buch auf.

Oliver
Gast
Nachtrag 2:

>dieses enthält (u.a.) eine Variable vom
>Type bit, die wiederum eine Variable Namens b0 enthält.

muß heissen:
dieses enthält (u.a.) eine Variable mit Namen bit, die wiederum eine 
Variable Namens b0 enthält.

Oliver
Gast
Hallo Oliver,

ich habe mir den Code nochmal genauer angesehen:

header.NextPacketPointer ist ein Integer und mit b0 ist das LSB von 
diesem Int gemeint. Also wird hier wohl auf gerade oder ungerade von 
header.NextPacketPointer geprüft. Hätte man aber auch anders coden 
können.

Gruß aus Köln

Frank
Gast
>header.NextPacketPointer ist ein Integer und mit b0 ist das LSB von
>diesem Int gemeint.

Nö.

header.NextPacketPointer ist von mir aus ein int. Das lässt sich der 
Zeile nicht entnehmen, ist aber zu vermuten.

Auf diesen int wird per & ein pointer gebildet und dieser nach BYTE_VAL* 
gecastet. Dort, wohin dieser pointer zeigt, befindet sich eine 
Datenstruktur unbekannten Typs, die eine Variable mit Namen bits 
enthält, die wiederum eine Variable mit Namen b0 enthält. Der ganze 
Ausdruck gibt den Wert dieser Variablen b0 zurück. Nach der Namensgebung 
ist zu vermuten, daß bits ein oder mehrere bytes repräsentiert, wobei b0 
das LSB davon ist. Damit würde dann der in bits repräsentierte Wert auf 
gerade bzw. ungerade geprüft, nicht aber header.NextPacketPointer.

Oliver
Gast
Ähh, doch :-)

Der Ausdruck liefert doch das LSB von header.NextPacketPointer. Der 
pointer zeigt ja darauf.

>Hätte man aber auch anders coden können.

Wohl war. z.B als
1
(header.NextPacketPointer & 0x01)

Oliver
Gast
Hallo Oliver,

genau so "[c](header.NextPacketPointer & 0x01)[/]" werde ich es auch
umschreiben, sonst weiss ich in einem halben Jahr nicht mehr was ich da 
geschrieben habe. Danke noch mal.

Gruß aus Köln

Frank

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.