Forum: Compiler & IDEs Array Wertezuweisung - Frage zu Pointerarithmetik


von Nico (Gast)


Lesenswert?

Moin
Beim Aufräumen von nem alten Projekt habe ich folgendes geändert ohne es 
damals getestet zu haben:
Es soll eigentlich nur ein unsigned char, welches vorher über den uart 
in ein data array gelesen wurde, geparst werden...
1
unsigned char messageType = (unsigned char) *(data+COLOR_MESSAGE_HEADER2_LOCATION);
2
switch (messageType)
3
{...
Wobei data
1
unsigned char data[MESSAGE_SIZE_COLOR];
und
COLOR_MESSAGE_HEADER2_LOCATION wie folgt aussehen:
1
#define COLOR_MESSAGE_HEADER2_LOCATION    1
Jetzt seh ich, dass messageType immer 0 ist - versteh allerdings nicht 
ganz wieso. Ich vermute, dass liegt an der Pointerarithmetik...
Das kann doch so gar nicht funktionieren, weil 
COLOR_MESSAGE_HEADER2_LOCATION gar nicht der Größe eines unsigned char 
entspricht, oder???
Muß ich in dem Define die Bytegröße von nem unsigned char angeben??? Wie 
mach ich das...

von Nico (Gast)


Lesenswert?

Andererseits hat ein unsigned char genau ein Byte auf nem 8bit AVR... 
Daher müßte das mit den Defines - in diesem Fall - doch eigentlich 
gehen...

von Karl H. (kbuchegg)


Lesenswert?

Nico schrieb:

> Das kann doch so gar nicht funktionieren, weil
> COLOR_MESSAGE_HEADER2_LOCATION gar nicht der Größe eines unsigned char
> entspricht, oder???

Muss es auch nicht.

In C existiert die Identität:

   *(a+i) <==>  a[i]

Genau so ist Array-Indizierung definiert. Bei dir steht da also ein 
etwas verschleiertes
1
unsigned char messageType = (unsigned char)data[COLOR_MESSAGE_HEADER2_LOCATION];

ob das richtig ist kann man mit dem bischen Code nicht sagen.

> Muß ich in dem Define die Bytegröße von nem unsigned char angeben??? Wie
> mach ich das...

Gar nicht. Es gibt keinen Grund dazu.

von Karl H. (kbuchegg)


Lesenswert?

Lass uns doch damit anfangen, warum du meinst, das Ergebnis des 
Arrayzugriffs
   data[COLOR_MESSAGE_HEADER2_LOCATION]
auf unsigned char umcasten zu müssen. Welchen Datentyp hat den data?

Hintergrund:
Wenn du nicht casten musst, dann tus auch nicht!

Cast sind Waffen! Die setzt man nur dann ein, wenn es gar nicht anders 
geht, auf keinen Fall aber leichtfertig und so "Och, da caste ich mal"

Mit einem Cast hebelst du effektiv die Typüberprüfung des Compilers aus. 
Du sagst dem Compiler: "Halt die Schnauze, ich bin der Programmierer. 
Und wenn ich sage, das passt, dann passt es auch! Ich weiß schon was ich 
tue".
Nur solltest du dann aber auch wirklich wissen, was du da tust.

von Nico (Gast)


Lesenswert?

Hi und danke erstmal für die schnellen Antworten.

Das mit der Identität war mir bis eben nie so 100% bewußt bzw ich hab 
darauf noch nie so wirklich geachtet. Danke dafür.

Ich glaub ich hab meinen Fehler... Ich hatte mir die Werte im Debugger 
angeschaut - und dort stand da ne 0 drin. Trotzdem wird am switch 
korrekt verzweigt...
Irgendwie muß ich mich da am Anfang verschaut habe...

Trotzdem vielen Dank und sorry wegen des wenigen Codes... Mir ist die 
Netiquette schon bekannt - nur wollte ich auch nicht zu viel sinnloses 
posten...

von Nico (Gast)


Lesenswert?

Das mit dem Casten kam, meine ich, von früher - da hab ich das gemacht 
weil ich zwischen uint8_t und unsigned chars gewechselt bin...
Ich hatte aber alles auf die chars umgestellt - daher der überflüssig 
cast.
Danke für den Hinweis...

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.