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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.