2012-03-17 21 views
0

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 
~ $ 
+0

'FatalError'は' void() 'ですか?だからあなたは「状態」のようなものを呼んでいるのですか? 1:void(); '私はそれがコンパイルされても驚いています。 –

+0

ソースコードをください。 – blueshift

+0

コンマ演算子のためのものですが、conditionは0になります(ただし、 'FatalError'の' exit'のためではありません)。 – rivfaader

答えて

0

で終わる明らかにバグがあるので、 "を無視正しい形式の答えを見つけ、バグを見つけやすくしてください。より簡単なルートに進むと、問題を見つけるのが早くなるでしょう。単一のマクロを使用しようとする限り、デバッグするのは難しいでしょう。

具体的には、マクロを関数に変えてデバッグしやすくし、式をコンポーネントの部分に分割し、何が起こっているかをよりよく理解するためにprintステートメントを追加します。

printf("(((index) < (array_name)[0]) && ((index) >= 0)) = %d\n", 
     (((index) < (array_name)[0]) && ((index) >= 0))); 
printf("(array_name)[((index)/BYTE) + 1] = %d\n", 
     (array_name)[((index)/BYTE) + 1]); 
printf("((unsigned long)1 << ((index) % BYTE)) = %d\n", 
     ((unsigned long)1 << ((index) % BYTE))); 
printf("BYTE=%d\n", BYTE); 

// etc. 

printf("Index %ld out of range 0..%ld\n", (long)(index), (long)(array_name)[0]); 
+0

私はちょうど正しい答えを見つけましたが、私はまだ教えてください? –

1

を使用するようにgetbitを再定義まあ、問題が

if(! GetBit(pole, m)) 
にErathostenes機能であったと、思えます展開当然の !マクロで

、その条件は、私は感嘆符を削除し、初見でop1

((shift, and) ? 0 : 1) 

のリターンオペランドを切り替え

を否定された

!(range check) ? op1 : op2 

値は少し不合理なようですが、うまく動作します。

tあなたの時間に誰もがハンクします