unsigned long
の素数ビットを得るためにSieve of Erathostenesを実装しようとしていますので、特定のビットの値を調べるためにマクロを書きました。しかし、それはマクロでなければなりません)私はインデックスがビット範囲内にあるかどうかをテストする必要があったので、exit(1)
コールのvoid関数である関数呼び出しFatalError
があるので、コンマ演算子はマクロ全体を可能にします条件の内側Cのマクロの3進演算子のオペランドとしての3進演算子
#define GetBit(array_name, index) \
(((index) < (array_name)[0]) && ((index) >= 0)) ? \
(((array_name)[((index)/BYTE) + 1] & ((unsigned long)1 << \
((index) % BYTE))) ? 1 : 0) : \
(FatalError("Index %ld out of range 0..%ld\n", (long)(index), \
(long)(array_name)[0]), 0)
より読みやすい形式:
#define GetBit(array_name, index) \
(range check) ? \
((bit shift, and) ? 1 : 0) : \
(function call, 0)
array_name[0]
には、ビットの配列のサイズがあります。
だから私の問題ではないとしても最初のインデックスが範囲チェックを介して取得できること、である、ふるいは、インデックス2で始まり、プログラムがすぐに
~ $ gcc primes.c fatalerror.c -pedantic -Wall -g -std=c99 -lm; ./a.out
FATAL ERROR: Index 2 out of range 0..1000
~ $
'FatalError'は' void() 'ですか?だからあなたは「状態」のようなものを呼んでいるのですか? 1:void(); '私はそれがコンパイルされても驚いています。 –
ソースコードをください。 – blueshift
コンマ演算子のためのものですが、conditionは0になります(ただし、 'FatalError'の' exit'のためではありません)。 – rivfaader