www.mikrocontroller.net

Forum: Compiler & IDEs Type casting von Byte-Puffer zu long-Wert


Autor: G. B. (geri)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen

Ich verwende gcc und möchte Daten, welche in einem Byte orientierten 
Puffer gespeichert sind als long-werte interpretieren und einer Routine 
übergeben.

Wie würdet ihr diese bitte effizient gestalten?

Im nachfolgenden Beispiel enthält Puffer ab der Stelle 3 eine 
long-Variable, welche ich der Routine myProcedure übergeben möchte.
unsigned char buffer[40];

void myProcedure(long value)
{
  do someting with value
}

myProcedure((long)&buffer[3]); // funktioniert nicht:(

Bestimmt ist für die Sprache c hier etwas vorgesehen:)

Beste Grüsse

Geri

Autor: Marius (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo
Du musst den Pointer noch dereferenzieren:
myProcedure(*((long*)&buffer[3]));
MfG Marius

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In welcher Reihenfolge sind die Bytes denn abgelegt? Wenn das High-Byte 
zuerst kommt, dann könnte das funktionieren:
unsigned long wert;
for(char i = 3; i < 7; i++)
{
    wert <<= 8;
    wert += buffer[i];
}
Andernfalls die Zählrichtung umkehren.

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde einen struct definieren, der die Struktur des Pufferinhaltes 
beschreibt - das ist wesentlich übersichtlicher und besser pflegbar:

typdef struct _bufdesc {
   long   V1;
   long   Value;
   ...
} bufdesc;

bufdesc *pBufDesc = (bufdesc *) buffer;
myProcedure(pBufDesc->Value);

Autor: G. B. (geri)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen

Vielen Dank für Euer rasches Feedback!

Die Version von Marius scheint für mich aktuell passend, weil meine zu 
entwirrende Datenströme sehr unterschiedlich sind.

Uhu Uhuhu
Deine Version ist bestimmt auch sehr elegant - und eben wesser wartbar.


Johannes deine Version dünkt mich - gleich wie meine Variante - eben 
ineffizient.

Eine funktionierene aber eben nicht effiziente Varinate sieht so aus:
int32_t GetLongVal(byte* buffer)
{
  int32_t Value;

  memcpy(&Value, buffer, sizeof(Value)); //sizeof(Value));
  return Value;
}

Beste Grüsse

Geri

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Die Version von Marius scheint für mich aktuell passend, weil meine zu
> entwirrende Datenströme sehr unterschiedlich sind.

Du solltest dir dann für jeden Datentyp, der im Puffer stehen kann, 
einen struct definieren.

Ist zwar ein bischen Arbeit, aber macht das ganze Zeug deutlich 
übersichtlicher, als wenn du wild rumcastest.

Meine Erfahrung sagt mir: Typecasts sollte man meiden, wo immer 
möglich...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.