Преобразования, которые вы делаете, - это не преобразования из указателей в целые числа или структуры, а преобразования из чисел с плавающей точкой в целые числа и структуры. Выражение
(CELbool)*x
переводит значение *x
(которое, поскольку x
является float*
, является float
) в CELBool
, которое вы определили как typedef для некоторого целочисленного типа. Это преобразование в порядке, поскольку C допускает преобразования между значениями с плавающей запятой и целыми, поскольку существует разумный способ выполнить преобразование. Тем не менее, второй актерский состав -
(Color)*x
Color
является структурой, и C не определяет преобразования между типами с плавающей запятой и struct
s, так же как он не определяет преобразования между целочисленными типами и struct
s, поскольку в общем случае нет разумный способ сделать это преобразование.
Причина ошибки, связанной с «требуемым указателем или арифметическим типом», заключается в том, что приведение из float
должно быть к некоторому типу, в который float
s может быть преобразован, что может быть либо вещественным значением тип, целочисленный тип или тип указателя, поскольку float
s можно преобразовать в указатели (хотя это действительно плохая идея!) Тип Color
не ожидается списком разумных вещей компилятора для положить туда, следовательно, ошибка.
Надеюсь, это поможет!