Forum: Mikrocontroller und Digitale Elektronik Was bedeutet ((BYTE_VAL*)(&header.NextPacketPointer))->bits.b0


von Frank aus Köln (Gast)


Lesenswert?

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

von Oliver (Gast)


Lesenswert?

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

von Oliver (Gast)


Lesenswert?

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

von Oliver (Gast)


Lesenswert?

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

von Frank aus Köln (Gast)


Lesenswert?

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

von Oliver (Gast)


Lesenswert?

>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

von Oliver (Gast)


Lesenswert?

Ä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

von Frank aus Köln (Gast)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.