2017-02-12 14 views
-1

Я пишу код для связи с микроконтроллерами, используя последовательный (UART).
Я получаю данные, которые могут быть расположены во многих различных конфигурациях.
Некоторые пакеты могут содержать поплавки, другие - только символы. и т.д.В C Я могу инициализировать структуру typedef, используя массив байтов, но на C++ я не могу, есть ли способ обойти это?

Вот что я имею в C, и она работает просто отлично:

#define packed __attribute__((packed)) 

//this is a typedef struct I used, 

    typedef struct packed { 
        uint8_t cmd; 
        uint8_t src_uart; 
        uint8_t dst_uart; 
        void* stuff;}const * P_generic_t; 

//then i do the following to extract formatted info from my buffer 
//where pbuf->payload is an array of uint8_t(aka unsigned char) 

P_generic_t cg = (void *) pbuf->payload; 

Тогда я могу просто получить доступ к члену структуры, делая cg->cmd или cg->src_uart. Однако в C++ этот метод не работает.

Причина, по которой я сейчас использую C++, заключается в том, что я хочу использовать этот код для Arduino для побочного проекта, и я хочу надежный способ эффективного извлечения данных из моего буфера. Я получаю следующее сообщение об ошибке:

comclass.cpp:82: error: invalid conversion from 'void*' to 'P_simple_t {aka const<anonymous struct>*}' [-fpermissive] 

Я также пытался запустить этот код с помощью компилятора на cloud9 и я получаю подобную ошибку. Есть ли способ инициализировать мою структуру, как я сделал в C? Или есть лучший вариант?

Я знаю, что есть способ запустить определенную часть кода как C, используя extern 'C', (извините, я не знаю синтаксиса). Это вариант?

+0

«этот метод не работает», что * точно * вы пробовали? Показать реальный код и любой выход компилятора –

+0

'(void *) pbuf-> payload' ->' (P_generic_t) pbuf-> payload'. C++ не допускает неявное преобразование в и из 'void *' так же свободно, как C. – DeiDei

+0

Никогда не указывайте указатели 'typedef' на типы данных (вводит' * 'reall ymore сложнее, чем печатать' P_' ??)! И использование квалификатора 'const' после того, как спецификатор типа затрудняет чтение. И не используйте броски, если вы им не нужны, и не знаете все последствия. Сказал: почему вы ожидаете, что два разных языка ведут себя одинаково, просто потому, что здесь используется один и тот же синтаксис? – Olaf

ответ

1

Проблема эта линия:

P_generic_t cg = (void *) pbuf->payload;

Вы кастинг void* в P_generic_t. Так же, как говорит ошибка компилятора. Решение состоит в том, чтобы изменить состав (void*) на (P_generic_t). Или, если вы хотите пройти полный C++, используйте static_cast до P_generic_t.

+0

спасибо, что ошибка ушла – mig07zz