【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.20426

define定義でいちいちキャストしたくない。
投稿者---ms(2005/03/21 00:39:53)


組込み系の開発での質問です。

#define BITMASK (0x05)
unsigned char Status;
unsigned char Data;
;;;;;
Status = Data & BITMASK;

としたら、Statusのレジスタの周辺のアドレスを
不正に書き込んでしまいました。多分BITMASKが4バイト分のデータとして書かれたのだと思います。

そこで、
Status = Data & (unsigned char)BITMASK;
としたら、正常にStatusだけに書き込めました。

BITMASKを const unsigned charとすれば問題ないと思いますが、
#defineで定義した場合は、上記の場合かならず(unsigned char)
でいちいちキャストしなくてはだめでしょうか?
#defineで1バイト分であることを定義する方法はありますでしょうか?









この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:define定義でいちいちキャストしたくない。 20427 Ban 2005/03/21 01:46:30
<子記事> Re:define定義でいちいちキャストしたくない。 20432 shu 2005/03/21 10:54:34
<子記事> Re:define定義でいちいちキャストしたくない。 20446 REE 2005/03/22 09:38:12


No.20427

Re:define定義でいちいちキャストしたくない。
投稿者---Ban(2005/03/21 01:46:30)


組み込みは関係ないと思いますが

>#define BITMASK (0x05)

#define BITMASK ((unsigned char)(0x05))
もしくは、
#define BITMASK ('\x05')



この投稿にコメントする

削除パスワード

No.20429

Re:define定義でいちいちキャストしたくない。
投稿者---yukihiro(2005/03/21 06:47:18)


>> #define BITMASK (0x05)

> #define BITMASK ('\x05')

C言語においてこの2つは同値のはずです。



この投稿にコメントする

削除パスワード

No.20430

Re:define定義でいちいちキャストしたくない。
投稿者---やじうま(2005/03/21 07:59:31)


>>> #define BITMASK (0x05)
>
>> #define BITMASK ('\x05')
>
>C言語においてこの2つは同値のはずです。

そんな事とも限らない。


この投稿にコメントする

削除パスワード

No.20451

Re:define定義でいちいちキャストしたくない。
投稿者---yukihiro(2005/03/22 20:43:12)


あれ?そうでしたっけ?
と思って調べなおしましたが、どんな場合に違いが出るのかわかりませんでした。
よかったら教えてください。



この投稿にコメントする

削除パスワード

No.20432

Re:define定義でいちいちキャストしたくない。
投稿者---shu(2005/03/21 10:54:34)


0x05じゃなくて、0x5ではないでしょうか。

0x05の場合、 0000 0101 になり
0x5の場合、 0101 になります。

さらに、
http://www9.plala.or.jp/sgwr-t/c/sec13.html
を参考にして、

0x5u または、0x5Uにすれば良いかと思います。


この投稿にコメントする

削除パスワード

No.20435

Re:define定義でいちいちキャストしたくない。
投稿者---Ban(2005/03/21 13:34:03)


>0x05の場合、 0000 0101 になり
>0x5の場合、 0101 になります。

unsigned char が 8bit の環境(多くの場合はそうです)を考えると、
いずれも拡張されて結局 0000 0101 になります。

>0x5u または、0x5Uにすれば良いかと思います。

u を明示するのは本来正しいことだと思いますが、
u が明示するのは符合の有無であって、そのサイズではありませんし、
このケースでは明示の必要性は必ずしもありません。
signed でも unsigned でも、上記のビットパターンは 5と解釈されます。


この投稿にコメントする

削除パスワード

No.20441

Re:define定義でいちいちキャストしたくない。
投稿者---shu(2005/03/21 16:41:53)


4bitを1バイトと思う思い込みに、陥っていました。


この投稿にコメントする

削除パスワード

No.20446

Re:define定義でいちいちキャストしたくない。
投稿者---REE(2005/03/22 09:38:12)


>組込み系の開発での質問です。
>
>#define BITMASK (0x05)
>unsigned char Status;
>unsigned char Data;
>;;;;;
>Status = Data & BITMASK;
>
>としたら、Statusのレジスタの周辺のアドレスを
>不正に書き込んでしまいました。多分BITMASKが4バイト分のデータとして書かれたのだと思います。
>
>そこで、
>Status = Data & (unsigned char)BITMASK;
>としたら、正常にStatusだけに書き込めました。

本題とは直接関係有りませんが、こういうことってありえるのでしょうか?
右辺の型に関係なく左辺の型に変換されるように感じるのですが。



この投稿にコメントする

削除パスワード

No.20449

Re:define定義でいちいちキャストしたくない。
投稿者---tetrapod(2005/03/22 12:29:50)


もし本当にあったらコンパイラのバグでしょうね。

逆は見たことあります。
extern uint16 hardware_port;
hardware_port|=0x01;
で8ビット命令が生成される(演算上は8ビットアクセスで可能なので)ってのが。
extern volatile uint16 hardware_port; にしないとまずい一例でした。

ハードウェア的にバス幅32ビットな機械においては、8ビットアクセスにおいても
出力されるデータ幅は32ビットのままなので、ハード的にまずい回路があるとバグる...
ってのもありそうですけど、元発言者様の内容はそうではないので。



この投稿にコメントする

削除パスワード

No.20497

Re:define定義でいちいちキャストしたくない。
投稿者---ms(2005/03/27 23:50:54)


みなさん、ご回答ありがとうございます。

>もし本当にあったらコンパイラのバグでしょうね。

そうなんですか?
具体的なコードはこんな感じです。
#define BITMASK (0x05)
unsigned char Status;
Status= (~Status & BIT_MASK);

実際Statusの周辺が書き換えられてしまいました。

 Status= (~Status& (unsigned char)BIT_MASK);

このように、キャストしたら正常に動作したのでてっきり
キャストしないとダメだと思い込んでましたが。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧