Я пытаюсь реализовать Sieve of Erathostenes для получения простых битов массива unsigned long
, поэтому я написал макрос для проверки значения определенного бита .. (функция была бы проще, но это школьное присвоение, поэтому она должна быть макросом) Мне нужно было проверить, находится ли индекс в диапазоне битов, поэтому есть вызов функции FatalError
, которая является функцией void с вызовом exit(1)
, поэтому оператор запятой делает возможным весь макрос находиться внутри условия
#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
~ $