macです。 hamayan <hamayan@xxxxxxxxxxxxxxxx> wrote: > "Shouji> (まったく別のコンパイラに移植するときは怪しそうなところ(ビットフィールドの展 > "Shouji> 開位置、構造体のPackの仕方・・・)は注意しますが、同一メーカー、同一CPU向けでコ > "Shouji> ンパイラをバージョンアップしただけだったのに・・・シクシク) > > 不思議なのですが、ビットフィールド否定派の人は、何故コンパイラの > 問題をビットフィールドの是非に話をすり替えるのだろうか?ですね。 > > なんで? > コンパイラの問題なら、他にも有るし、それはコンパイラメーカーに直 > してもらえば良いだけの話では? 「直してもらう」といっても、仕様が統一されていないんだから、 なおしようがないんじゃないでしょうか? bit fieldをMSBから振ろうと、LSBから振ろうと別に、 コンパイラの欠陥でも、バグでもないですよ。 「コンパイラの問題をビットフィールドの是非に話をすり替え」 しているわけでなく、互換性、移植性を問題にしているのです。 ただ、それがもっとも顕著に表れるのが、たまたま、 bit field, struct, unionになってしまうだけです。 > 逆に、HEXで書く方がミスし易いと思いますが。 HEXで書くわけじゃなくって、 // Serial Mode Register (SCI_SMR) #define CM 0x80 // communication mode #define CHR 0x40 // character length #define PE 0x20 // parity enable #define PM 0x10 // parity mode #define STOP 0x08 // stop bit length #define MP 0x40 // Multi Prossesor #define CKS1 0x02 // clock select 1 #define CKS0 0x01 // clock select 0 #define ASYNC (!CM) // asynchronous mode #define CLKSYNC ( CM) // clock synchronous mode #define CHRLEN8 (!CHR) // character length 8 bit #define CHRLEN7 ( CHR) // character length 7 bit #define NONEPRTY (!PE|!PM) // none patity #define EVENPRTY ( PE|!PM) // even parity #define ODDPRTY ( PE| PM) // odd parity #define STOPLEN1 (!STOP) // stop bit length 1 bit #define STOPLEN2 ( STOP) // stop bit length 2 bit #define CLKDIV1 (!CKS1|!CKS0) // clock select (divider) 1/1 #define CLKDIV4 (!CKS1| CKS0) // clock select (divider) 1/4 #define CLKDIV16 ( CKS1|!CKS0) // clock select (divider) 1/16 #define CLKDIV64 ( CKS1| CKS0) // clock select (divider) 1/64 というような、ヘッダーを作っておき、 SMR0 = (ASYNC | CHRLEN8 | NONEPRTY | STOPLEN1 | !MP | CLKDIV1); と書くんです。 これをbit fieldで書くのとどっちが分かりやすいでしょうか (^o^) -- mac