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

Проблеиа с Attolic

есть структура

typedef struct COMMAND_S
{
    char *name;  
    uint32_t type; 
    uint32_t var_type;
    uint32_t minargs;
    uint32_t maxargs;
  
    uint32_t (*fp)(unsigned int, char **);
    
    uint32_t var_offset;  
    
}COMMAND;

extern const COMMAND commands[];

я ее инициализирую

COMMAND const commands[] =
{
    { "stop",    0,   0,   0,   2,   COM_Stop,   0  },
    { "start",   0,   0,   0,   2,   COM_Start,  0  }
}

в IAR компилируется и работает без проблем.

В Attolic получаю предупреждение

Quote

initialization from incompatible pointer type [-Wincompatible-pointer-types]
initialization from incompatible pointer type [-Wincompatible-pointer-types]

с объяснением

Quote

(near initialization for 'commands[0].fp')
(near initialization for 'commands[1].fp')

Функции COM_Stop, COM_Start находятся в другом модуле и подключены через заголовочный файл.

Что Атолику не нравиться?

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

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


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

1 hour ago, jenya7 said:

Функции COM_Stop, COM_Start находятся в другом модуле и подключены через заголовочный файл.

Прототипы COM_Start, COM_Stop соответствуют? Какие там? Покажите!

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


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

1 hour ago, Integro said:

Прототипы COM_Start, COM_Stop соответствуют? Какие там? Покажите!

uint32_t COM_Start(uint32_t argc, char** args);
uint32_t COM_Stop(uint32_t argc, char** args);

в IAR все прекрасно работает

 

Хм...прикольно... 

uint32_t (*fp)(unsigned int, char **);

это не

uint32_t (*fp)(uint32_t, char **);

для Атолика

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

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


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

Ну да, никто не обещал, что unsigned int и uint32_t будут считаться одинаковыми при проверке на совпадение типов. В этом легко углядеть резон: если мы пытаемся делать переносимый код, компилятор помогает отловить места, где разрядность целого типа может быть иной на другой платформе.

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


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

Я бы грешил на char * name, который должен быть char const * name.

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


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

да, GCC так же бы отреагировал, но он бы пояснил что uint32_t это long unsigned int

Edit: хотя нет, в данном случае он так бы и предупредил что не совместимые типы

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


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

2 hours ago, scifi said:

Ну да, никто не обещал, что unsigned int и uint32_t будут считаться одинаковыми при проверке на совпадение типов. В этом легко углядеть резон: если мы пытаемся делать переносимый код, компилятор помогает отловить места, где разрядность целого типа может быть иной на другой платформе.

получается Атолик круче IAR  :)

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


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

2 hours ago, Сергей Борщ said:

Я бы грешил на char * name, который должен быть char const * name.

я пробовал убрать const. все равно получал предупреждение

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


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

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

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

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

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

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

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

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

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

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