1

ビットフィールドにアクセスしようとしています:

以下は、正常に動作し、期待される結果が得られるコードですが、以下で言及したコンパイラ警告をスローします。

#include <stdio.h>
#include <stdint.h>


struct status_type_one{
unsigned delta_cts : 1;// lsb
unsigned delta_dsr : 1;
unsigned tr_edge : 1 ;
unsigned delta_rec : 1;
unsigned cts : 1;
unsigned dsr : 1;
unsigned ring : 1;
unsigned rec_line : 1;// msb
} status_one;

struct status_type_two {
unsigned : 4; // lsb 4 bits
unsigned cts : 1; //bit 5
unsigned dsr : 1; // bit 6
} status_two;



int main(void)
{
  status_one.delta_cts=1;
  status_one.delta_dsr=0;
  status_one.tr_edge=1;
  status_one.delta_rec=0;
  status_one.cts=1;
  status_one.dsr=0;
  status_one.ring=1;
  status_one.rec_line=1;

  printf("The value of status_one is %x\n",status_one);  // warning here

  status_two.cts=1;
  status_two.dsr=1;

  printf("The value of status_one is %d\n",status_two);  // warning here



    return 0;
    }

しかし、私は警告を下回っています:

$ gcc -Wall Bit_Fields.c -o Bit_Fields
Bit_Fields.c: In function `main':
Bit_Fields.c:35: warning: unsigned int format, status_type_one arg (arg 2)
Bit_Fields.c:35: warning: unsigned int format, status_type_one arg (arg 2)
Bit_Fields.c:40: warning: int format, status_type_two arg (arg 2)
Bit_Fields.c:40: warning: int format, status_type_two arg (arg 2)

以下に示すように、出力は正しいです

$ ./Bit_Fields
The value of status_one is d5
The value of status_one is 48

警告の内容と解決方法を教えてください。

ありがとう

4

1 に答える 1

3

これを解決する一般的な方法は、整数型の共用体値を使用することです。次に例を示します。

union status_type_one
{
   struct status_type_one{
       unsigned delta_cts : 1;// lsb
       unsigned delta_dsr : 1;
       unsigned tr_edge : 1 ;
       unsigned delta_rec : 1;
       unsigned cts : 1;
       unsigned dsr : 1;
       unsigned ring : 1;
       unsigned rec_line : 1;// msb
   } bits;
   unsigned whole[1];       // Size should match the total bits size.
} status_one;

ここで、他のコードを変更する必要があります。

status_one.bits.delta_cts=1;
status_one.bits.delta_dsr=0;
status_one.bits.tr_edge=1;
... etc ...

そしてプリント:

printf("The value of status_one is %x\n",status_one.whole[0]);

[明らかに、構造体全体が複数の項目である場合は、ループするか、いくつかの値を printf に渡す必要があります]

あなたがしていることはうまくいっているように見えるかもしれませんが、STRUCT を printf 関数に渡すことは実際には想定されていません。複数の機械語に相当するデータを使用するとどうなるか、または 64 で何が起こるかはわかりません。 -ビットマシンなど

于 2013-01-10T09:41:18.867 に答える