www.mikrocontroller.net

Forum: Compiler & IDEs char array in struct zurückpacken


Autor: Mathias H. (mathias_h)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Leute, ich steh hier vor einem kleinen Problem und hoffe ihr könnt 
mir helfen:
Ich habe eine struct:
typedef struct
{
    unsigned long ltime;
    unsigned char type;
    unsigned char z[2];
}
array_t;

array_t a[48],buffer;
in der Mainfunktion muss ich dieses struct nun in ein char array 
umwandeln um es per Funk zu übertragen. Das mach ich mit folgendem code:
  unsigned char *b;
  b=(unsigned char *)&a[1]; 
(und das b-array wird dann übertragen)

Das funktioniert auch soweit ganz gut.
Jetzt fehlt mir aber auf der Empfängerseit die Umwandlung des 
empfangenen array zurück in das struct. sicherlich könnte ich die byte 
einzeln zuweisen, aber ich hab da eher an soetwas wie
buffer=(array_t*)&b; 
gedacht, was aber nicht funktioniert. Bekomme immer nur Compiler-Fehler.
Kann mir vielleicht jemand helfen?

Vielen Dank für eure Mühe
Matze

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mathias H. schrieb:

> Ich habe eine struct:
>
> typedef struct
> {
>     unsigned long ltime;
>     unsigned char type;
>     unsigned char z[2];
> }
> array_t;
> 
> array_t a[48],buffer;
> 
> in der Mainfunktion muss ich dieses struct nun in ein char array
> umwandeln um es per Funk zu übertragen. Das mach ich mit folgendem code:
>
>   unsigned char *b;
>   b=(unsigned char *)&a[1];
> 
> (und das b-array wird dann übertragen)

Du meinst &a[0]

  b = (unsigned char*)a;
hätte es auch getan.

> Das funktioniert auch soweit ganz gut.

gut.

> Jetzt fehlt mir aber auf der Empfängerseit die Umwandlung des
> empfangenen array zurück in das struct.

> sicherlich könnte ich die byte
> einzeln zuweisen, aber ich hab da eher an soetwas wie
>
> buffer=(array_t*)&b;
> 
> gedacht, was aber nicht funktioniert.

Wie immer, wie sind die Datentypen der beteiligten Variablen?
Welchen Typ hat 'buffer'?

Wenn das wie oben ein array_t ist, dann ist alles klar.
(Warum heist der Datentyp eigentlich array_t? Ein selten blöder Namen. 
Nenn Datentypen die du selbst baust, genauso wie Variablen, nicht nach 
dem Typ [hier Array], sondern nach dem was du da drinnen speicherst. 
Eine Zusammenfassung von ltime, type und z repräsentiert etwas. Was 
repräsentiert es? Ist das eine Stempelzeit, ist das der Zeitpunkt an dem 
Alarm ausgelöst wurde, ist das der Zeitpunkt wie lange ein Buch 
entliehen wurde ... je nachdem nennst du deinen Datentyp projektbezogen 
mit einem entsprechenden Begriff. Aber nicht array_t. Das ist ein 
nichtssagender Name und noch dazu falsch. Denn du hast eine struct und 
kein Array. Die Tatscahe, dass du den Datentyp benutzt um damit ein 
Array aufzubauen ist irrelevant.)

Du brauchst schon ein Pointervariable, damit du die Adresse von b so 
umcasten kannst, dass dir dieser Pointer auf den Anfang von b zeigt, 
aber der Speicherinhalt dort anders interpretiert wird.

  array_t* inputBuffer;
  inputBuffer = (array_t*)b;

  for( i = 0; i < 10; ++i )
    mach was mit inputBuffer[i].ltime

Autor: Mathias H. (mathias_h)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich weiß, dass array_t nicht sonderlich gut klingt ... das spielt auch 
nicht die Rolle, es ging mir um das reine Verständnis. buffer war oben 
auch als array_t definiert.

Das struct ist am Ende viel größer, da es Beschleunigungswerte, 
Temperaturwerte und ein timestamp enthält, für die Frage/als Beispiel 
ist mir ertmal nichts anderes eingefallen :)!

Auf jeden Fall vielen,vielen Dank! Stand ein wenig auf dem Schlauch, 
jetzt funktioniert es aber!!

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.