Forum: Compiler & IDEs Code-Interpretation


von Christoph A. (paul87)


Lesenswert?

Hallo,

ich versuche mich gerade in ein Programmcode einzuarbeiten. Ich habe 
aber ein paar allgemeine Verständnisprobleme.
1
void canMsgToTSRResult(const CCanMessage* canMsg, CTSRResultEMP2* sign)
2
{
3
  const unsigned char* msgData = canMsg->MsgData;
4
5
  sign->SpeedLimitSign_kmh    = (int) msgData[0];
6
  sign->SupplementarySignType    = ((int) msgData[1])>>4;
7
  sign->NonSpeedLimitSignType    = (((int) msgData[1]) >> 0) & 0x0F;
8
  sign->SignVisionOnlyDecision  = (((int) msgData[6]) >> 5) & 0x03;
9
  sign->SignLaneAssignment    = (((int) msgData[6]) >> 3) & 0x03;
10
  sign->bElectronicSign      = (((int) msgData[6]) >> 2) & 0x01 ? 1 : 0;
11
  sign->Filter          = (((int) msgData[7]) >> 4) & 0x0F;
12
  sign->DistanceToSign_m    = (((int) msgData[7]) >> 0) & 0x0F;
13
  sign->DistanceToSign_m    <<= 2; // unit: 4m
14
15
  if( 0 == sign->SpeedLimitSign_kmh ) 
16
  {
17
    sign->NonSpeedLimitSignType = SPEED_LIMIT_END;
18
  }
19
}

Z.B. folgende Zeile
1
   sign->NonSpeedLimitSignType    = (((int) msgData[1]) >> 0) & 0x0F;
Warum verschiebe ich etwas um 0 Stellen und warum verknüpfe ich es dann 
mit 0x0F?? Wenn ich etwas mit UND verknüpfe und F, dann bleibt doch 
alles erhalten wie es war oder nicht? Und wenn ich es mit 0 verknüpfe 
lösche ich die Bits. Aber warum sollte ich die an dieser Stelle löschen?

Vielen Dank Leute!

von Georg A. (georga)


Lesenswert?

Typischer Code, um Bitfelder aus Bytes zu extrahieren. Das >>0 ist 
tatsächlich überflüssig, aber aus Konsistenzgründen nicht verkehrt, da 
merkt man eben gleich die Startposition. Das &0x0f filtert einfach die 
oberen 4 Bits aus, wenn einen nur die unteren 4 interessieren. Die 
oberen 4 Bit werden ja eine Zeile vorher extrahiert.

von Christoph A. (paul87)


Lesenswert?

Hallo Georg,

vielen Dank für die schnelle Antwort. Ich hatte irgendwie ein Brett vor 
dem Kopf. Ich sitze eindeutig zu lange davor! :P

von Christoph A. (paul87)


Lesenswert?

Und was genau bedeutet der Pfeil hinter sign?

von tro0ll (Gast)


Lesenswert?

sign ist ein Pointer auf ein struct und du greifst auf dessen Variable 
NonSpeedLimitSignType zu. Ist nur syntaktischer Zucker für 
(*sign).NonSpeedLimitSignType.

von Christoph A. (paul87)


Lesenswert?

Ok, vielen Dank für die Antwort!

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.