Struktur in Strukrur kopieren



  • Hallo,
    ich habe mal wieder ein kleines Problem bei der bearbeitung eines bereits bestehenden Programms.

    Mein Ziel ist es eine Struktur in eine andere zu kopieren.
    Das Problem jedoch ist, das jene Struktur welche kopiert werden soll, große ist, als jene in welche diese hinein kopiert erden soll.

    Dies liegt daran, das die "empfangende" Struktur im spaeteren Programmverlauf als eine Sammlung von Parameterdaten an eine Funktion uebergeben wird.

    Die zu kopierende Struktur

    typedef struct
    {
      unsigned int  var1  :12;
      unsigned char var2  : 3:
      unsigned char var3  : 2:
      unsigned char var4  : 7:
      unsigned int  var5  : 1:
      unsigned char var6  : 7:
      unsigned char var7  : 4:
      unsigned char var8  : 4:
    
      unsigned char param1;
      unsigned char param2;
    
      bit  (* check_function) (void);
      void (* error_function) (void);
    } ORIGINAL_STRUKTUR;
    

    Die Struktur in welche kopiert werden soll

    typedef struct
    {
      unsigned int  var1  :12;
      unsigned char var2  : 3:
      unsigned char var3  : 2:
      unsigned char var4  : 7:
      unsigned int  var5  : 1:
      unsigned char var6  : 7:
      unsigned char var7  : 4:
      unsigned char var8  : 4:
    } EMPFAENGER_STRUKTUR;
    

    Es sollte also leicht ersichtlich sein, dass ich waehrend der uebergabe der unteren Struktur an eine Funktion nur an den oberen 8 Variablen (var1 bis var8) interesssiert bein.

    Leider ist mir bisher keine praktikable loesung eingefallen /bekannt mit der sozusagen eine Filterung der Struktur waehrend des kopierens mmoeglich ist.

    Vorweg schonmal vielen Dank an alle Helfer.

    Mit freundlichem gruß
    Eule



  • Und wo liegt das Problem?

    memcpy(&dest, &src, sizeof(dest));
    


  • Danke,
    aber diese Funktion war mir einfach nicht bekannt.
    Konnte leider auch nichts in meinen schlauen Büchern finden 😞

    Danke ^^ Wieder was gelernt.



  • Das geht für diesen Fall auch einfacher:

    EMPFAENGER_STRUKTUR emp;
    ORIGINAL_STRUKTUR org;
    
    emp = *(EMPFAENGER_STRUKTUR*)&org;
    


  • Wobei der Compiler daraus meist auch nur einen memcpy-Aufruf macht. Was sich schöner liest/schreibt, dürfte Geschmackssache sein ...


  • Mod

    F schrieb:

    Wobei der Compiler daraus meist auch nur einen memcpy-Aufruf macht. Was sich schöner liest/schreibt, dürfte Geschmackssache sein ...

    Ich kann mir vorstellen, dass die Variante von Wutz eventuell besser optimiert werden kann. memcpy ist extrem schnell aber es ist immer noch ein Funktionsaufruf. Wenn die structs sehr klein (so 4-8 Bytes klein) sind, kann sich eventuell eine direkte Kopie lohnen. Der Compiler kann dies dann besser abschätzen, als wenn man ihm vorgibt, dass es memcpy sein muss. Aber das ist Mikrooptimierung und sollte nicht ungetestet übernommen werden.



  • Ersteinaml an alle vielen herzlichen Dank für die ganzen Antwortwn.
    Mir hatt "memcpy" schon voellig ausgereicht.

    Da ein definierter Speicherblock, kopiert wird, für den mir vorschwebenden Anwendungsfall eine sihere und vorallems chnelle möglichkeit.

    Da das Programm welches ich schreibe aber evtl. in abgeänderter Form auch auf einem µProz eingesetzt werden koennte, muesse ich mir nocheinmal ansehen wie deiser damit umgeht. Ob nicht eine direkte zuweisung der einzelnen Strukturelemente zueinander sinnvoller wäre (im falle des µProz).

    Gruß
    Eule


Anmelden zum Antworten