Forum: Compiler & IDEs Zeiger Umwandlung


von Felix (Gast)


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)

von Nico S. (Gast)


Lesenswert?

Ö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.

von Nico S. (Gast)


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.

von Felix (Gast)


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???

von Nico S. (Gast)


Lesenswert?

Was steht denn da? Was soll da stehen? Bitte mal posten.

Die Syntax ist soweit äquivalent.

von Besserwisser (Gast)


Lesenswert?

Anstatt
char *Bytedings; könnte es auch
unsigned char *Bytedings; heißen!!

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Felix (Gast)


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

von Felix (Gast)


Lesenswert?

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

ist das nicht relativ langsam? Ich müsste dann ja noch die Wert'e
hochzählen.

von Felix (Gast)


Lesenswert?

ä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?

von Besserwisser (Gast)


Lesenswert?

printf("%i",strlen(bool));

von Peter D. (peda)


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

von Karsten Brandt (Gast)


Lesenswert?

@Besserwisser:

Du meinst sicherlich

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

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

Karsten

von Besserwisser (Gast)


Lesenswert?

Klar, die Hitze ließ mein Hirn verdunsten.

von Ulrich (Gast)


Lesenswert?

Ein paar Poster wissen es bereits, aber der Rückgabetyp von sizeof ist
eine Ganzzahl in Bytes.... ;-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.