Casting struct in int

Gibt es eine saubere Möglichkeit der Umwandlung von einer struct in einen uint64_t oder andere int, gegeben, dass die Struktur in <= an den sizeof int?
Das einzige, was ich denken kann, ist nur eine " ok " - Lösung zu verwenden, die Gewerkschaften. Aber ich war noch nie lieb.

Lassen Sie mich fügen Sie ein code-snippet zu klären:

typedef struct {
uint8_t field: 5;
uint8_t field2: 4;
/* and so on... */
}some_struct_t;

some_struct_t some_struct;
//init struct here

uint32_t register;

Nun wie kann ich warf some_struct zu erfassen, seine bits um in uint32_t registrieren.

Hoffe das macht es ein wenig klarer.

  • Es gibt immer memcpy !
  • Dies würde eine nette Antwort 🙂
  • Nicht "fond" der Gewerkschaften? Eine union macht genau das, was Sie tun möchten, in eine klare, vertretbare Möglichkeit. Was ist nur "OK" dazu?
  • Ich nehme an nur "ok" weil es bedeuten würde, die Schaffung einer neuen union der code für jedes struct der OP will konvertieren nach int. In der Erwägung, dass die memcpy Vorschlag ist weniger Arbeit für jede neue Struktur, die konvertiert werden muss
  • Ich habe keine Ahnung, wie diese zu beantworten, ohne zu wissen, was Sie eigentlich brauchen diese für. Mehr Informationen bitte.
  • Es gibt einen Weg, um Darsteller struct Zeiger auf int-Zeiger, aber es ist sehr wahrscheinlich, um Folge zu undefiniertem Verhalten. Wenn Sie mehr gern zu undefiniertem Verhalten als Gewerkschaften, diese link zeigt, wie man die hack.
  • Ich mag auch die Gewerkschaften - Sie haben zu viel politische macht :):):)
  • nur für die Politik, Kommentar <g> ich mag Gewerkschaften, vor allem für den embedded-hardware-Registern und dergleichen, und ich habe nicht zu zahlen keine Mitgliedsbeiträge oder streiken.
  • Warum stoppen Sie am mit memcpy nur für diese? Könnten Sie eine Art von makro-editor zum ändern von Quell-code zur Verwendung von memcpy () - Aufrufe für alle Aufgaben <g>
  • Vielleicht ist es weniger Arbeit, wenn es viele Strukturen umgewandelt werden, aber im Gegensatz zu memcpy, es ist unmöglich zu schaffen, das einen Pufferüberlauf mit einem union. Ich würde erwarten, dass es würde auch optimieren, viel besser mit den meisten Compilern.
  • Nun habe ich beschlossen, stick mit den Gewerkschaften am Ende, das ist die billigste Lösung, nachdem alle.
  • Nicht memcpy Ausrichtung abhängig?
  • Ich verstehe nicht, warum würden Sie wollen, um "zu fangen seine bits um". Was sind Sie wirklich erreichen wollen? Ich Stimme mit @djechlin hier.
  • Nein, memcpy ist in der Tat der einzige Weg, es zu tun portabel (D. H. nach der Norm) und der Ausrichtung abhängig. Auch wenn alte Compiler waren manchmal buggy ist in dieser Hinsicht (gcc 3.3 auf SPARC nicht behandeln, es richtig mit der option-O3).

InformationsquelleAutor GoTTimw | 2012-08-10
Schreibe einen Kommentar