Перейти к содержанию
    

Keil cast to struct

Компилятор выдает ошибку:

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;
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А вы разве не приводите указатель к структуре, вместо указателя на структуру?

Можно еще -Wextra -Wall какие-нибудь попробовать :)

Изменено пользователем Valentine Loginov

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Зачем вообще приведения нужны? void* специально сделан для того что бы они не требовались.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы забыли одну звездочку. Кейл ругается правильно:

struct led_class* self = (struct led_class *) malloc(sizeof(led_class));

 

А в целом - вы создали вручную классический C++ класс. Переходите на плюсы, там все это пишется гораздо проще и даст точно такой же выходной код.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...