Zeiger Umwandlung

Gast #366334
Lesenswert?
• ▲
▼
Hallo,

ich muss relativ zeitkritisch 240Bit hintereinander einlesen. So mache
ich es zurzeit:
Mit malloc 240Bit vom Type bool reservieren. Die Bit's hintereinander
in den Speicher schreiben. Danach habe ich etwas Zeit zum verarbeiten.

Ich habe jetzt 240 einzelne Bits, nur brauche ich eigentlich Word und
Byte lange Datenwörter.

Kann ich einen Byte-Pointer z.B. gleich der Startadresse des
Datenfeldes setzen und dann auf die ersten 8Bit per Byte zugreifen?

Wie gruppiere ich meine Bit's ohne sie z.B. per while() in ein Byte zu
schreiben?

Gibt es vielleicht eine viel schönere Lösung?

cu, Felix

(WinAVR Atmel16)
Gast #366336
Lesenswert?
• ▲
▼
Nachtrag:

mit
  Daten[0]  greifst du auf das erste Bit zu, mit
  Daten[1]  auf das zweite, etc.

Mit
  Bytedings[0]  greifst du auf den ersten 8-bittingen Block zu, mit
  Bytedings[1]  auf den zweiten, etc.
Gast #366337
Lesenswert?
• ▲
▼
genauso wollte ich es machen, aber irgendwie stehten in Bytedings[0]
nicht die ersten 8 Bits.

Meine Syntax ist allerdings etwas anders.

Bytedings[1] wär bei mir *(Bytedings+1)

Aber daran dürfte es doch nicht liegen???
Persönliche Seite #366340
Lesenswert?
• ▲
▼
Der Datentyp "bool" ist nicht ein Bit, sondern in der Regel äquivalent
zu int, also je nach Prozessor 16 oder 32 Bit groß.

Daher kann das oben aufgeführte Typecasting nicht funktionieren.

C unterstützt keine Bit-Datentypen, zwar gibt es Bitfelder, auf die
aber kann nicht mit Arrayoperatoren zugegriffen werden.

Beispiel:

  union
  {
    struct
    {
      unsigned char bit0 : 1;
      unsigned char bit1 : 1;
      unsigned char bit2 : 1;
      unsigned char bit3 : 1;
      unsigned char bit4 : 1;
      unsigned char bit5 : 1;
      unsigned char bit6 : 1;
      unsigned char bit7 : 1;
    } bitfeld;
    unsigned char zeichen;
  } bla;

Hier kann mit

  bla.bitfeld.bit0 = 0;

ein einzelnes Bit manipuliert werden, und mit

  bla.zeichen = 0;

auf -in diesem Falle- alle 8 Bits simultan zugegriffen werden.

Es gibt aber keinen Arrayoperator für Bitfelder, so daß die von Felix
erwähnte Einleseroutine die einzelnen Bits nicht einfach in ein Array
eintragen kann.

Stattdessen müsste entweder mit solchen Bitfeldern wie in meinem
Beispiel gearbeitet werden, was reichlich umständlich ist, oder aber
die Bits werden von vornherein mit entsprechenden Bitoperationen in
ganze Bytes eingetragen:


  unsigned char Wert;
  int i;

  Wert = 0;

  for (i = 0; i < 8; i++)
    Wert |= LeseEingang() << i;

Hier wird vorausgesetzt, daß die Funktion LeseEingang 0 oder 1
liefert.

Das muss bei größeren Bitanzahlen entsprechend adaptiert werden.
Gast #366341
Lesenswert?
• ▲
▼
@Nico: Ich deute "Was steht da" mal so :)
Die ersten 8Bit 0b11000000(steht auch wirklich im Speicher) -> 0xC0
bekommen habe ich aber 0xD9 was ich als Zeiger ins Nirgendwo gedeutet
habe.


@Besserwisser: bei mir heißt es uint8_t
#366345
Lesenswert?
• ▲
▼
"ich muss relativ zeitkritisch 240Bit hintereinander einlesen."


Bitstrukturen sind in der Regel sehr ineffizient programmiert.


Wenns wirklich schnell sein soll, dann je 8 Bit seriell in ein Byte
reinschieben, das Byte in einem Byte-Array abspeichern und den Zeiger
aufs Array um 1 hochzählen usw. Also quasi SPI in Software.


Peter

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.