Array Wertezuweisung - Frage zu Pointerarithmetik

Gast #2502293
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...
#2502337
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.
#2502340
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.
Gast #2502359
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...
Gast #2502366
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...

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 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.