LINUX.ORG.RU

Арифметика средствами препроцессора

 , ,


0

1

Есть такая штука:
#define ХРЕН 1.0/KOEFF
Если я попытаюсь сделать так:
double BRED [ХРЕН + 1];
то совершенно логично получу такое:
size of array 'BRED' has non-integral type 'double'

Вопрос: как бы извернуться и преобразовать этот Хрен в целое?
По своей сути и дальнейшей арифметике он должен быть даблом и округление тут недопустимо. Но при формировании массива — вполне можно округлить и даже нужно.
Но как?

★★☆

Вай-вай, касты никто не отменял. ;)

#define XPEH (1.0/KOEFF)
#define KETCHUP ((int)XPEH + 1)

double BRED[(int)XPEH + 1];
double BUTTER[KETCHUP];

beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 1)
Ответ на: комментарий от d

GCC, чем же ещё.
Ок. Сейчас вынесу этот код отдельно и попробую уже на абстрактном примере.

Stahl ★★☆
() автор топика
Ответ на: комментарий от Stahl

Усё работает:

#include <stdio.h>

#define KOEFF   0.5
#define XPEH    (1.0/KOEFF)
#define KETCHUP ((int)XPEH + 1)
#define N(x)    (sizeof(x)/sizeof((x)[0]))

int
main()
{
        double BRED[KETCHUP];
        printf("%zu, %d\n", sizeof(BRED), N(BRED));
        return 0;
}
$ make xpen && ./xpen
24, 3
beastie ★★★★★
()
Ответ на: комментарий от d

оператор кастования к int имеет приоритет выше, чем оператор деления, следовательно, если KOEFF у топикстартера имеет тип double, то выражение будет double

Harald ★★★★★
()
Ответ на: комментарий от Harald

Дык, я ведь не зря в своём примере в скобки взял. ;)

beastie ★★★★★
()
Ответ на: комментарий от Harald

А, мы с тобой о разном коде говорим. ТС отвечал beastie, и я комментировал код второго.

То, что ТС не оборачивает define в скобки, говорит о его уровне. Как и сам топик.

d ★★★★
()
Ответ на: комментарий от Harald

оператор кастования к int имеет приоритет выше, чем оператор деления

Вот тут я и облажался — нужно было больше скобок впихнуть.

Stahl ★★☆
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.