10

ビットフィールド (合計 32 ビット幅) を持つ構造体があり、32 ビット変数があります。変数値を構造体に代入しようとすると、エラーが発生しました。

エラー: 'uint32_t {aka unsigned int}' から非スカラー型 'main()::CPUID' への変換が要求されました。

struct CPUIDregs
    {
       uint32_t EAXBuf;
    };
CPUIDregs CPUIDregsoutput;   


int main () {

 struct CPUID          
    {
          uint32_t   Stepping         : 4;         
          uint32_t   Model            : 4;        
          uint32_t   FamilyID         : 4;        
          uint32_t   Type             : 2;        
          uint32_t   Reserved1        : 2;         
          uint32_t   ExtendedModel    : 4;         
          uint32_t   ExtendedFamilyID : 8;          
          uint32_t   Reserved2        : 4;          
    };

    CPUID CPUIDoutput = CPUIDregsoutput.EAXBuf;

最短の方法でそれを行う方法はありますか?ありがとう

PS もちろん、実際のコードでは EAX のより適切な値がありますが、ここでは影響しないと思います。

4

4 に答える 4

14

コンパイラが構造をメモリにレイアウトする方法に依存しないでください。単一の割り当てでやりたいことを行う方法はいくつかありますが、私はお勧めも教えもしません。

割り当てを行うための最良の方法は次のとおりです。

static inline void to_id(struct CPUid *id, uint32_t value)
{
    id->Stepping         = value & 0xf;
    id->Model            = value >> 4 & 0xf;
    id->FamilyID         = value >> 8 & 0xf;
    id->Type             = value >> 12 & 0x3;
    id->Reserved1        = value >> 14 & 0x3;
    id->ExtendedModel    = value >> 16 & 0xf;
    id->ExtendedFamilyID = value >> 20 & 0xff;
    id->Reserved2        = value >> 28 & 0xf;
}

そしてその反対

static inline uint32_t from_id(struct CPUid *id)
{
    return id->Stepping
         | id->Model << 4
         | id->FamilyID << 8
         | id->Type << 12
         | id->Reserved1 << 14
         | id->ExtendedModel << 16
         | id->ExtendedFamilyID << 20
         | id->Reserved2 << 28;
}
于 2012-06-01T14:27:15.517 に答える
10

ユニオンを使用してください。

union foo {
    struct {
        uint8_t a : 4;
        uint8_t b : 4;
        uint8_t c : 4;
        uint8_t d : 4;
        uint16_t e;
    };
    uint32_t allfields;
};

int main(void) {
    union foo a;

    a.allfields = 0;
    a.b = 3;

    return 0;
}
于 2016-06-08T20:12:53.957 に答える
2

誰かが興味を持っている場合でも、私は自分の質問に対するより良い解決策を持っています:

*(reinterpret_cast<uint32_t *> (&CPUIDoutput)) = CPUIDregsoutput.EAXBuf;
于 2012-06-04T10:32:27.367 に答える
1

これらは構造体メンバーであるため、直接割り当てるか、割り当ての RHS が type の値であることを確認する必要がありますCPUID。整数から構造体に代入できると期待する理由がわかりません。

構造体にビットフィールドが含まれているという事実、およびビットの合計がたまたま割り当てようとしている整数のビット数と同じであるという事実は、何の意味もありません。割り当ての目的では、それらはまだ互換性のある型ではありません。

これがあいまいすぎる場合は、より多くの/より良いコードを表示することを検討してください。

于 2012-06-01T13:43:51.410 に答える