spectr 0 25 мая, 2016 Опубликовано 25 мая, 2016 · Жалоба Компилятор выдает ошибку: error: #119: cast to type "struct led_class" is not allowed struct led_class* self = (struct led_class) malloc(sizeof(led_class)); Почему кейл не умеет в приведение к структуре? И как это починить? Код: typedef struct led_class { uint8_t pin; GPIO_TypeDef* gpio; } led_class; struct led_class* led_create(GPIO_TypeDef* GPIO, uint8_t pin) { struct led_class* self = (struct led_class) malloc(sizeof(led_class)); self->gpio = GPIO; self->pin = pin; led_init(self); return self; } void led_init(led_class* self) { self->gpio->MODER |= 1 << (self->pin * 2); self->gpio->ODR = 0 << self->pin; } void led_on(led_class* self) { self->gpio->ODR = 1 << self->pin; } int main(void) { led_class* led = led_create(GPIOD, 2); led_on(led); } *пробовал включать --c99 - не помогает. * пробовал включать --strict - вылазит куча ошибок из system_stm32f4xx.c UPD: Если переписать конструктор вот так (без приведения), то работает: struct led_class* led_create(GPIO_TypeDef* GPIO, uint8_t pin) { led_class* self = malloc(sizeof(led_class)); self->gpio = GPIO; self->pin = pin; led_init(self); return self; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
becopt 0 25 мая, 2016 Опубликовано 25 мая, 2016 (изменено) · Жалоба А вы разве не приводите указатель к структуре, вместо указателя на структуру? Можно еще -Wextra -Wall какие-нибудь попробовать :) Изменено 25 мая, 2016 пользователем Valentine Loginov Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kabdim 0 25 мая, 2016 Опубликовано 25 мая, 2016 · Жалоба Зачем вообще приведения нужны? void* специально сделан для того что бы они не требовались. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
spectr 0 25 мая, 2016 Опубликовано 25 мая, 2016 · Жалоба Спасибо за советы, буду ботать дальше )) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 25 мая, 2016 Опубликовано 25 мая, 2016 · Жалоба Вы забыли одну звездочку. Кейл ругается правильно: struct led_class* self = (struct led_class *) malloc(sizeof(led_class)); А в целом - вы создали вручную классический C++ класс. Переходите на плюсы, там все это пишется гораздо проще и даст точно такой же выходной код. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться