реклама на сайте
подробности

 
 
> Перенос кода в среду IAR
Василий Зыков
сообщение Mar 14 2017, 09:45
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 63
Регистрация: 11-11-06
Из: Екатеринбург
Пользователь №: 22 191



Добрый день, коллеги!
Переношу проект, написанный в AVR Studio 4 под WinAvr, в среду IAR
Столкнулся с тем, что IAR ругается на такую конструкцию (ошибка Pe513):

ssp.spiHwInit=(void *)atmega_spi_init;

где объявления даны следующим образом:

euint8 atmega_spi_init(atmegaSpiInterface *iface);

и
Код
struct SdSpiProtocol
{
    void *spiHwInterface;
    euint8 (*spiHwInit)(void* spiHwInterface);
    euint8 (*spiSendByte)(void* spiHwInterface,euint8 data);
};
typedef struct SdSpiProtocol SdSpiProtocol;
Подскажите, пожалуйста, как ее правильно описать в IAR?

Сообщение отредактировал IgorKossak - Mar 14 2017, 15:08
Причина редактирования: [codebox] для длинного кода. [code]-для короткого!!! Лишние пустые строки!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
scifi
сообщение Mar 14 2017, 09:46
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Очевидно, компилируете в режиме Си++. Не надо так делать. Пусть будет просто тёплый ламповый Си.
Go to the top of the page
 
+Quote Post
Василий Зыков
сообщение Mar 14 2017, 09:53
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 63
Регистрация: 11-11-06
Из: Екатеринбург
Пользователь №: 22 191



Цитата(scifi @ Mar 14 2017, 14:46) *
Очевидно, компилируете в режиме Си++. Не надо так делать. Пусть будет просто тёплый ламповый Си.

Да нет, проверил, в настройках стоит С. C dialect C99
Go to the top of the page
 
+Quote Post
scifi
сообщение Mar 14 2017, 10:10
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Василий Зыков @ Mar 14 2017, 12:53) *
Да нет, проверил, в настройках стоит С. C dialect C99

А, не заметил, что, очевидно, указатель на функцию приводите к void* и присваиваете другому указателю на функцию. Это безобразие. Если какой-то компилятор такое проглатывал, то это неправильный компилятор.
Можно сделать вот так:
Код
ssp.spiHwInit=(euint8 (*)(void*))atmega_spi_init;

Но необходимость приведения типа указателя на функцию настораживает, конечно. Кто придумал всё это безобразие?
Go to the top of the page
 
+Quote Post
Василий Зыков
сообщение Mar 14 2017, 10:55
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 63
Регистрация: 11-11-06
Из: Екатеринбург
Пользователь №: 22 191



Цитата(scifi @ Mar 14 2017, 15:10) *
А, не заметил, что, очевидно, указатель на функцию приводите к void* и присваиваете другому указателю на функцию. Это безобразие. Если какой-то компилятор такое проглатывал, то это неправильный компилятор.
Можно сделать вот так:
Код
ssp.spiHwInit=(euint8 (*)(void*))atmega_spi_init;

Но необходимость приведения типа указателя на функцию настораживает, конечно. Кто придумал всё это безобразие?


Winavr такое проглатывает..... другой разработчик давно написал этот код. Работало и работало. Пока не появилась необходимость что-то поменять.

Спасибо огромное! Заработало! Только... теперь я не понимаю, как эта конструкция построена. Так сложно на первый взгляд. Спасибо еще раз!
Почему-то без приведения типа компилятор тоже выдает ошибку... меня это тоже смущает.

Сообщение отредактировал IgorKossak - Mar 14 2017, 15:09
Причина редактирования: бездумное цитирование
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 03:26
Рейтинг@Mail.ru


Страница сгенерированна за 0.03957 секунд с 7
ELECTRONIX ©2004-2016