Forum: Compiler & IDEs Struktur Bitfeld in Struct Bitfeld kopieren


von Jens k. (ramogi)


Lesenswert?

Hallo

ich habe zwei struct erstellt um zwei Register nachzubilden.

Nun möchte ich den Inhalt von

struct struct_Src {

       unsigned int a:   4;
       unsigned int b:   4;
       unsigned int c:   8;
       unsigned int d:   8;
       unsigned int e:   8;

}Src;

an

struct struct_Dst {

       unsigned int dst:   16;

}Dst;

übergeben.

Hier ist mein Ansatz

=======================================================================
#include"stdio.h"

typedef struct struct_Src {

       unsigned int a:   4;
       unsigned int b:   4;
       unsigned int c:   8;
       unsigned int d:   8;
       unsigned int e:   8;

}Src;

typedef struct struct_Dst {

       unsigned int dst:   16;

}Dst;

 void set(Src* pset){

   pset->a = 1;
   pset->b = 2;
   pset->c = 1;
   pset->d = 1;
   pset->e = 0;

 }

 void cpy(Src* pSrc, Dst* pDst)
{
   pDst = pSrc;
}

int main(void)
{

  Src mySrc;
  Dst myDst;
  set(&mySrc);
  cpy(&myDst);

  return 0;
}
=================================================

Da mein Lösungsansatz nicht funzt wäre ich über einen Lösungsansatz sehr 
dankbar!

Frohe Ostern!!!

von Klaus W. (mfgkw)


Lesenswert?

Jens k. schrieb:
> nicht funzt

Das ist mein Vorschlag für die Fehlerbeschreibung des Tages.


Wie willst du eigentlich 4+4+8+8+8 Bit aus Src in den 16 Bit aus Dst 
unterbringen?

von union (Gast)


Lesenswert?

Du möchtest einen Speicherbereich unterschiedlich interpretieren? Dann 
schau dir mal das Schlüsselwort union an.

von Jens k. (ramogi)


Lesenswert?

@mfgkw, union

danke für die rasche Antowrt.

Ja mggkw, funzt nicht ist eine sehr vage Beschreibung meines Problems.

Da dieses Gebiet für mich Neuland ist konnte ich die Problemstellung 
nicht besser umreißen. Srry dafür.


Also nochmal ausführlicher:

Src -> zu übertragende Nachricht

Dst -> mein Transfer Register
Mal angenommen die Nachricht ist 32-bit groß, aber das Transfer-Register 
hat nur eine Kapazität von 16-bit.

Also würde ich gerne die ersten 16-bit von Src übergeben und nach dem 
Transfer die nächsten 16-bit.

Gibt es da eine bestimmte vorgehensweise ?

Kann man Src als char casten und mit einer for schleife nur die ersten 
16-bit senden ?

Gruß

von Klaus W. (mfgkw)


Lesenswert?

ja, kann man - auch wenn man Probleme mit Portabilität bekommen kann.
Da du aber gar keine Byte haben willst, sondern jeweils 16 Bit, könnte 
man auch auf uint16_t casten (natürlich mit ähnlichen Problemen, nur in 
diesem Fall einfacher als char*).

Man kann auch eine union verwenden (Prinzipiell mit denselben 
Problemen).

In beiden Fällen sollte man sich im Klaren sein, was in welcher Hälfte 
steht und ob der Empfänger das genauso sieht (Litte endian/big endian).

Das Thema wird hier alle paar Tage durchgekaut. Es sollte mit wenig 
Aufwand einiges dazu zu finden sein...

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.