重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

初歩的な質問をご容赦ください。

typedef struct tagStruct {
____int a: 2;
____int b: 2;
} STRUCT;

STRUCT st = {1, 2};
/*ビットフィールドをすべてクリア*/
(*int)st = 0;

みたいなことはできないのでしょうか。
コンパイラに、intは必要ありません、と言われて削除すると*演算子の使い方が違う、と怒られてしまいます。
言語仕様レベルで不可能なことなのでしょうか?

A 回答 (6件)

*(int *)&st = 0;



これでintサイズに0を代入できる。
アドレスを(int *)にキャストしたアドレスの値はint。
    • good
    • 0
この回答へのお礼

ありがとうございます。
これぞ求めていたコードです。
多用しないほうがよい、アクロバティックなコードなのでしょうか?気になるところではあります。

お礼日時:2005/04/19 21:14

>具体的なコード


ということで、サンプルをば
#include <stdio.h>

typedef union tagStruct {
struct {
unsigned a:2, b:2;
} bit;
unsigned bitall;
} STRUCT;
void main(void){
STRUCT st;
st.bit.a=1;
st.bit.b=2;
printf("%d, %d\n", st.bit.a, st.bit.b);
st.bitall = 0;
printf("%d, %d\n", st.bit.a, st.bit.b);
}
int a
の部分をunsignedに変えているのは、
%dでintに格上げされたときに、マイナスになってしまうのをそうしないためです。
ビットで操作する場合には、特別なんでも構いません。
    • good
    • 0
この回答へのお礼

ご丁寧にありがとうございます。なるほど、ビットフィールドに別名をつけるやり方ですね。変数名が長くなってしまうのは好みではないですけど、参考になりました。

BLUEPIXYさんをはじめ、rentaheroさん、SSBBGLUVさんの皆さんには、丁寧なお付き合いをいただき、本当に感謝しております。この場をお借りして、お礼申し上げます。これからもどうかよろしくご教授くださいませ。

お礼日時:2005/04/20 01:23

union(共用体)にすればいいかと思います

    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
unionは使ったことがないのでそんな使い方があるとは!驚きです。union型にキャストして代入するのですか?具体的なコードをぜひご教示ください。

お礼日時:2005/04/19 21:07

ん~。

「言語仕様レベルで不可能か」という質問に対してなので、可能と答えましたが、#3の方の意見も確かにもっともなので(モトローラ系のCPUではバスエラーの危険性は否定できない)、その場合は

memset(&st, 0, sizeof(STRUCT));

となります。
    • good
    • 0
この回答へのお礼

早速のご回答本当にありがとうございます。
丁寧に何度もお答えくださり、勉強中の私には参考になることばかりです。ビットフィールドはint型と決めうちしたコードは危険なのですね。
ありがとうございました。

お礼日時:2005/04/19 20:40

構造体の型によってはメモリバウンダリエラーが発生するかもしれないので、stをintと見なすより素直にmemsetで0クリアするほうが安全だと思いますよ(この例だと大丈夫だと思いますが)。

    • good
    • 0
この回答へのお礼

すばやいご回答、ありがとうございます。
メモリ境界値が調整されていないとアーキテクチャによってはエラーが発生するというのを聞いたことがありますが、その関連のお話でしょうか?
SSBBGLUVさんはお笑いになるかもしれませんが、私はCライブラリを一切使いたくないのです。わがままですよね?

余計なことを言いました。ご回答、ありがとうございました。

お礼日時:2005/04/19 20:47

テストプログラムを一応だしときます。




#include <stdio.h>

struct tagStruct
{
signed a: 2;
signed b: 2;
};
typedef struct tagStruct STRUCT;

int main()
{
STRUCT st = {1, 2};
printf("%d, %d\n", st.a, st.b);
*(int *)&st = 0;
printf("%d, %d\n", st.a, st.b);
return 0;
}


結果
1, -2
0, 0
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!