Forum: Compiler & IDEs Strukturinhalte elegant an Funktion übergeben


von Dennis (Gast)


Lesenswert?

Guten Tag!

Ich habe folgendes Anliegen.

Im Programm gibt es eine Struktur
1
struct
2
{
3
  unsigned char a : 8;
4
  unsigned char b : 8;
5
  unsigned char c : 8;
6
  unsigned char d : 8;
7
  unsigned char e : 8;
8
} Struktur;

sowie eine Funktion, die als Argument ein Array erwartet:
1
void eine_funktion(unsigned char ein_array[4]);

Nun möchte ich aus der Struktur alle Elemente ausser c in dieses Array 
schreiben.

(Wie) geht das?

Grüße

Dennis

von Karl H. (kbuchegg)


Lesenswert?

Dennis schrieb:
> Guten Tag!
>
> Ich habe folgendes Anliegen.
>
> Im Programm gibt es eine Struktur
>
1
> struct
2
> {
3
>   unsigned char a : 8;
4
>   unsigned char b : 8;
5
>   unsigned char c : 8;
6
>   unsigned char d : 8;
7
>   unsigned char e : 8;
8
> } Struktur;
9
>
>
> sowie eine Funktion, die als Argument ein Array erwartet:
>
>
1
> void eine_funktion(unsigned char ein_array[4]);
2
>
>
> Nun möchte ich aus der Struktur alle Elemente ausser c in dieses Array
> schreiben.
>
> (Wie) geht das?

Du wirst lachen
1
  unsigned char data[4];
2
  data[0] = Struktur.a;
3
  data[1] = Struktur.b;
4
  data[2] = Struktur.d;
5
  data[3] = Struktur.e;
6
7
  eine_funktion( data );
;

von foo (Gast)


Lesenswert?

So wie die Struktur jetzt definiert ist, kommst du nicht drumrum, ein 
temporäres Array zu erzeugen, wo du die gewünschten Elemente manuell 
reinkopierst.

Wenn du die Reihenfolge in der struct zu a,b,d,e,c ändern kannst, 
könntest du direkt die struct anstelle des Arrays übergeben (wobei c von 
der Funktion ignoriert wird). (Vorausgesetzt das Alignment stimmt, 
worauf ich mich nicht unbedingt verlassen würde)

Die elegante Lösung mit sauberem C-Code wäre ansonsten immer manuelles 
Kopieren (dank Optimizer ist das immer noch deutlich schneller als die 
Zeit die du sonst mit Fehlersuche verbringst) oder, falls durch die Art 
der Funktionsparameter sinnvoll, die Funktion umschreiben dass sie 
direkt die struct annimmt.

von Dennis (Gast)


Lesenswert?

Klasse!

Danke für Eure Antworten.
Das bringt mich weiter!

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.