Strukturinhalte elegant an Funktion übergeben

Gast #4141614
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
#4141620
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 );
;
Gast #4141622
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren