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


von Mathias H. (mathias_h)


Lesenswert?

Hi Leute, ich steh hier vor einem kleinen Problem und hoffe ihr könnt 
mir helfen:
Ich habe eine struct:
1
typedef struct
2
{
3
    unsigned long ltime;
4
    unsigned char type;
5
    unsigned char z[2];
6
}
7
array_t;
8
9
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:
1
  unsigned char *b;
2
  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
1
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

von Karl H. (kbuchegg)


Lesenswert?

Mathias H. schrieb:

> Ich habe eine struct:
>
1
> typedef struct
2
> {
3
>     unsigned long ltime;
4
>     unsigned char type;
5
>     unsigned char z[2];
6
> }
7
> array_t;
8
> 
9
> array_t a[48],buffer;
10
>
> 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:
>
1
>   unsigned char *b;
2
>   b=(unsigned char *)&a[1];
3
>
> (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
>
1
> buffer=(array_t*)&b;
2
>
> 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.

1
  array_t* inputBuffer;
2
  inputBuffer = (array_t*)b;
3
4
  for( i = 0; i < 10; ++i )
5
    mach was mit inputBuffer[i].ltime

von Mathias H. (mathias_h)


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

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.