2

私はビットフィールドの概念が初めてです。構造内の要素にアクセスしようとしていますが、aa=vこのようにエラーが表示されています。

error: incompatible types when assigning to type ‘cc’ from type ‘long unsigned int ’

そして、型キャストするとエラーが表示されますaa= (cc)v;

error: conversion to non-scalar type requested

構造体へのポインタを宣言して要素にアクセスしようとしました。この場合はうまくいきましたが、この場合は構造体へのポインターを宣言せず、要素にアクセスする必要があります。どうすればこのエラーを克服できますか。

事前に助けてくれてありがとう

#include<stdio.h>
typedef struct 
{
        unsigned long a:8;
    unsigned long b:8;
    unsigned long c:8;
    unsigned long d:8;
}cc;


int main()
{ 
        cc aa ;
    unsigned long v = 1458;
    printf("%d\n",sizeof(aa));
    aa=v;    // aa= (cc)v;
    printf("%d %d %d %d\n", aa.a,aa.b,aa.c,aa.d);

    return 0;
}
4

5 に答える 5

6

複数のデータ型として同じデータにアクセスする場合はunion、 C でan を使用する必要があります。次のスニペットを見てください。

  1. それを32ビット整数として扱うユニオンに書き込みます
    (そして)
  2. 4つの個別の8ビットビットフィールドとしてデータにアクセスします
    (また、適切な測定のために)
  3. 同じデータに 32 ビット整数として再度アクセスする

#include<stdio.h>

typedef struct {
    unsigned long a:8;
    unsigned long b:8;
    unsigned long c:8;
    unsigned long d:8;
}bitfields;

union data{
    unsigned long i;
    bitfields bf;
};

int main()
{ 
    union data x;
    unsigned long v = 0xaabbccdd;
    printf("sizeof x is %dbytes\n",sizeof(x));

    /* write to the union treating it as a single integer */
    x.i = v;

    /* read from the union treating it as a bitfields structure */
    printf("%x %x %x %x\n", x.bf.a, x.bf.b, x.bf.c, x.bf.d);

    /* read from the union treating it as an integer */
    printf("0x%x\n", x.i);

    return 0;
}

ユニオンが整数としてアクセスされる場合、システムのエンディアンによって個々のビットフィールドの順序が決定されることに注意してください。したがって、上記のプログラムを 32 ビット x86 PC (リトル エンディアン) で実行すると、次のように出力されます。

sizeof x is 4bytes
dd cc bb aa
0xaabbccdd
于 2013-08-01T09:42:34.463 に答える
3

aaは構造体であり、そうではないためです。エラー メッセージが示すようvに、型に互換性がありません。がビットフィールドの構造体であってもcc、構造体としてのみ使用でき、個別のメンバーを持ち、整数とは異なります。

于 2013-08-01T09:00:21.123 に答える
2

私が間違っている場合は修正してください。ただし、4 バイト サイズの構造体に 4 バイト サイズの long を割り当てたいと考えていました。はいの場合、これはあなたのためかもしれません:

 aa = *(cc*)&v;

ただし、この場合、エンディアンに注意する必要があります

于 2013-08-01T09:31:34.383 に答える
0

これを使って :

aa.a = v;

それ以外の

aa = v;
于 2013-08-01T09:02:49.373 に答える
0

互換性のないに を代入しようとしlongています。struct

cc の内部値を v に割り当てることができます。

cc c;
unsigned long v = 1458;
c.b = v;

たとえば、最初の8ビットを入れたい場合は、次のaことができます

cc c;
unsigned long v = 1458;
c.a = v % 255;
c.b = v / 255 % 65280;
于 2013-08-01T09:02:55.270 に答える