Pointer auf die nächsten 8 Bit?

Gast #1860177
Lesenswert?

Hallo,

Ich habe eine 16Bit Variable (uint16_t x) und einen 8bit Pointer 
(uint8_t * *test ). Mit dem Pointer würde ich gerne erst auf denn Anfang 
der Varable X zeigen und als nächstes auf die Mitte, also die nächsten 8 
Bit, aber ich bekomm es einfach nicht hin. Kann Mir jemand mit etwas C 
code Aushelfen?

Noch etwas: Es ist ein 16 Bit Controller und wenn ich den Pointer um 
eins hochzähle springt der immer 16 Bit weiter und nicht 8. :(
#1860189
Lesenswert?

Klaus schrieb:
> Hallo,
>
> Ich habe eine 16Bit Variable (uint16_t x) und einen 8bit Pointer
> (uint8_t * *test ).

Wenn das kein Tippfehler ist, dann ist das falsch

> Noch etwas: Es ist ein 16 Bit Controller und wenn ich den Pointer um
> eins hochzähle springt der immer 16 Bit weiter und nicht 8. :(

Das hat damit nichts zu tun, dass du einen 16 Bit Controller hast.
Dein Pointer Datentyp ist einfach falsch. Das ist alles.
Gast #1860190
Lesenswert?

Klaus schrieb:
> Ich habe eine 16Bit Variable (uint16_t x) und einen 8bit Pointer
> (uint8_t * *test ). Mit dem Pointer würde ich gerne erst auf denn Anfang
> der Varable X zeigen und als nächstes auf die Mitte, also die nächsten 8
> Bit, aber ich bekomm es einfach nicht hin. Kann Mir jemand mit etwas C
> code Aushelfen?

Das ist ungeschickt, Stichwort Endianess :-)

Was hindert dich daran, die Variable einzulesen und dann zu maskieren?
z.B. so:
1
uint16_t x = 2323 //irgendwas
2
uint8_t lowbyte, highbyte;
3

4
lowbyte = x & 0x00FF;
5

6
highbyte = (x & 0xFF00) >> 8;
Gast #1860203
Lesenswert?

Karl heinz Buchegger schrieb:
> Das hat damit nichts zu tun, dass du einen 16 Bit Controller hast.
> Dein Pointer Datentyp ist einfach falsch. Das ist alles.

Das habe ich mir schon gedacht, aber ich hab keine Ahnung wieso, bzw wie 
es hinbekomme. Ich hab schon alles mögliche versucht einen 8 bit Pointer 
hinzubekommen, klappt aber nicht

Karl heinz Buchegger schrieb:
> Wenn das kein Tippfehler ist, dann ist das falsch

War ein Tippfehler. uint8_t *test, so hab ich's gemacht.
#1860205
Lesenswert?

Klaus schrieb:

> Das habe ich mir schon gedacht, aber ich hab keine Ahnung wieso, bzw wie
> es hinbekomme. Ich hab schon alles mögliche versucht einen 8 bit Pointer
> hinzubekommen, klappt aber nicht

Meine Kristallkugel ist schon im Wochenende.
Vielleicht kannst du dich zufällig noch daran erinnern, was 'alles 
mögliche' gewesen sein könnte?
Gast #1860221
Lesenswert?

Karl heinz Buchegger schrieb:
> Vielleicht kannst du dich zufällig noch daran erinnern, was 'alles
> mögliche' gewesen sein könnte?

Da ich schon den ganzen morgen daran rumpfusche hab ich das meiste auch 
schon wieder vergessen.

So sieht mein lezter ansatz aus:
1
uint16_t string;
2
uint8_t zeichen;
3

4
zeichen = (*(uint8_t *) &string)   //erste 8bit
5
zeichen = (*(uint8_t *) &string+1) //letzte 8bit
#1860253
Lesenswert?

Klaus schrieb:
> zeichen = (*(uint8_t *) &string+1) //letzte 8bit

Hier solltest Du Dir mal die Rangfolge der Operatoren klar machen. 
Dadurch. dass Du manche Elemente näher zusammenschreibst, ändert die 
sich ja nicht.

Deine Setzung von Leerzeichen suggeriert eine Rangfolge, die der Sprache 
C fremd ist.  Zunächst mal ist das, was Du schreibst, dasselbe wie
1
zeichen = *(uint8_t *) &string+1
denn die erste und letzte Klammer sind überflüssig.  Und das ist nach 
den C-Rangregeln
1
zeichen = (*(uint8_t *)&string) + 1
oder, ohne überflüssige Klammern, aber auch ohne falsche Zusammenhänge 
suggerierende Leerzeichen,
1
zeichen = *(uint8_t *)&string + 1
Ich denke, das zeigt, was passiert.  Du bekommst das erste Byte und 
zählst 1 zum Byte dazu.

Wie Du die Klammern jetzt setzst, dass Du die 1 zum Pointer statt zum 
Byte hinzuzählst, sei Dir zur Übung überlassen.
#1860259
Lesenswert?

Detlev T. schrieb:
> @kbuchegg
> Du setzt damit aber voraus, dass der Compiler die Bytes "packt". Also
> jeweils 2 Bytes in ein 16-Bit-Wort. Das ist nicht selbstverständlich

?
Ich denke bei einem uint16_t kann man schon davon ausgehen, dass die 
beiden Bytes hintereinander im Speicher liegen, auch wenn ich im Moment 
keine Stelle aus dem Standard parat habe, die das fordert bzw. offen 
lässt. Die Reihenfolge ist allerdings nicht festgelegt.

Aber ich sagte ja auch, dass die Lösung vom Floh besser ist.
Gast #1860271
Lesenswert?

Also zunächst mal Danke! Denn es geht jetzt endlich was ich wollte.

Karl heinz Buchegger schrieb:
> Ich denke bei einem uint16_t kann man schon davon ausgehen, dass die
> beiden Bytes hintereinander im Speicher liegen,

Sollte ich auch meinen, wie sonst kann mann sicher mit einem 16Bit 
Pointer einzelne 16 Bitvariablen ansprechen? Wenn dem nicht so wäre geht 
ja jeders Programm mit Pointer in die Binsen, oder nicht?

Karl heinz Buchegger schrieb:
> Aber ich sagte ja auch, dass die Lösung vom Floh besser ist.
Wieso das besser ist leuchtet mir noch nicht ein. Ich finde das 
Codebeispiel von floh nicht gut, zumal ich dann immer noch mit einer 16 
Bitvariable rum kämpfe während meine Funktion welcher ich die jetzt 
gewonnenen Werte übergebe einen Pointer auf eine 8 Bit Variable 
erwartet.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren