Pointer auf die nächsten 8 Bit?

Gast #1860177
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. :(
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
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
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.
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?
In der Zwischenzeit
1
  uint16_t x;
2
  uint8_t* test;
3

4
  test = (uint8_t*) &x;
5

6
  wert1 = *test;
7
  test++;
8
  wert2 = *test;

aber eigentlich ist die Lösung von Floh besser, als da mittels 
Pointercasting auf die Bytes zuzugreifen.
@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, 
insbesondere da du ja gar nicht weißt, welcher Compiler mit welchen 
Einstellungen hier verwendet wird.
Gast
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
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.
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
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

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