www.mikrocontroller.net

Forum: GCC Struktur Bitfeld in Struct Bitfeld kopieren


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Jens k. (ramogi)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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!!!

Autor: Klaus Wachtler (mfgkw)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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?

Autor: union (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Du möchtest einen Speicherbereich unterschiedlich interpretieren? Dann 
schau dir mal das Schlüsselwort union an.

Autor: Jens k. (ramogi)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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ß

Autor: Klaus Wachtler (mfgkw)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
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.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net