mikrocontroller.net

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


Autor: Frank aus Köln (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe folgenden Code aus dem Microchip TCP/IP stack für den ENC28J60:
if(header.NextPacketPointer > RXSTOP || ((BYTE_VAL*)(&header.NextPacketPointer))->bits.b0 ||
     header.StatusVector.bits.Zero ||
     header.StatusVector.bits.CRCError ||
     header.StatusVector.bits.ByteCount > 1518u ||
     !header.StatusVector.bits.ReceiveOk)
  {
    Reset();
  }

Ich verstehe die bedeutung von diesem vergleich nicht:
((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

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
((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

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Frank aus Köln (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
(header.NextPacketPointer & 0x01)

Oliver

Autor: Frank aus Köln (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.