Почему я получаю "арифметика типа указателя обязательна"? - PullRequest
4 голосов
/ 07 марта 2012

В следующем коде я получаю сообщение об ошибке при вводе указателя с плавающей точкой на структуру, но компилятор не выдает жалоб, если я приведу тип к чему-то другому.Почему он это делает?

typedef unsigned byte CELbool;
typedef struct {(...)} Color;
typedef struct {
    (...)
    Color color;
    CELbool b;
} Light;

Light _light;

void function(float *x) {
    _light.b = (CELbool)*x; // No error
    _light.color = (Color)*x; // (!) Used type 'Color' where arithmetic or pointer type is required
}

Редактировать : Скажем, у меня есть * x указатель на цвет, тогда какой будет правильный способ получить этот цвет?В настоящее время я использую Color c = *((Color *)(value)), но я не думаю, что это правильный способ сделать это.

1 Ответ

7 голосов
/ 07 марта 2012

Преобразования, которые вы делаете, - это не преобразования из указателей в целые числа или структуры, а преобразования из чисел с плавающей точкой в ​​целые числа и структуры. Выражение

(CELbool)*x

переводит значение *x (которое, поскольку x является float*, является float) в CELBool, которое вы определили как typedef для некоторого целочисленного типа. Это преобразование в порядке, поскольку C допускает преобразования между значениями с плавающей запятой и целыми, поскольку существует разумный способ выполнить преобразование. Тем не менее, второй актерский состав -

(Color)*x

Color является структурой, и C не определяет преобразования между типами с плавающей запятой и struct s, так же как он не определяет преобразования между целочисленными типами и struct s, поскольку в общем случае нет разумный способ сделать это преобразование.

Причина ошибки, связанной с «требуемым указателем или арифметическим типом», заключается в том, что приведение из float должно быть к некоторому типу, в который float s может быть преобразован, что может быть либо вещественным значением тип, целочисленный тип или тип указателя, поскольку float s можно преобразовать в указатели (хотя это действительно плохая идея!) Тип Color не ожидается списком разумных вещей компилятора для положить туда, следовательно, ошибка.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...