Zeiger Umwandlung

Gast #366334
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 #366335
Öhm.. Jetzt mal nur ne Idee:
1
bool *Daten = malloc(240*sizeof(bool));
2
char *Bytedings;
3
Bytedings = (char*) Daten;
Zugriff dann mit Bytedings[0], Bytedings[1], Bytedings[2] usw.
Gast #366336
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
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
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
@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
Gast #366343
äh, also wenn bool=int ist, dann würde das nicht in den Speicher
passen.

240x8Bit = 1920Bit der Atmel hat aber nur 1k RAM, den Speicher bekomme
ich aber.

Oder verpeile ich das jetzt?
#366345
"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
Gast #366346
@Besserwisser:

Du meinst sicherlich

printf("%i", *sizeof*(bool)); ;-)

Mit strlen kannst Du nur die Länge eines NULL-terminierten Strings
ermitteln.

Karsten

Antwort schreiben

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