как привести typedef структуру к аргументу uint8_t - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть определенная функция:

uint32_t match_data(uint8_t * data_in, uint16_t size_data_in);

, где я пытаюсь использовать следующую структуру typedef в качестве аргумента

typedef struct
{
uint8_t chars[5]
uint8_t ADC;
}Data

Data input;

input.chars[0] = 65;
input.chars[1] = 66;
input.chars[2] = 67;
input.chars[3] = 68;
input.chars[4] = 69;
input.ADC = 255;

match_data((uint8_t *)input, sizeof(input)); 

Функция match_data () возвращает операндвведите 'Data', где требуется арифметика или тип указателя

Как я могу привести структуру typedef к uint8_t?если я использую его в качестве ссылки и получаю ту же ошибку

, я могу привести его напрямую, если использую только массив char, но не при использовании typedef struct

1 Ответ

0 голосов
/ 03 декабря 2018

Вам нужно привести адрес объекта struct, а не самого объекта struct:

match_data((uint8_t *)&input, sizeof(input));

Это работает, поскольку адрес объекта гарантированно будет равен адресу первого члена (т.е. chars).

Обратите внимание, однако, что небезопасное / неопределенное поведение для доступа к другим элементам данных, то есть ADC через такой указатель.Это связано с тем, что компилятор может вводить байты заполнения между элементами, и доступ к такой области заполнения является неопределенным поведением (поскольку области заполнения находятся в неопределенном состоянии; см., Например, этот стандартный черновой вариант C * ):

J.2 Неопределенное поведение ... Значение объекта с автоматической продолжительностью хранения используется, пока оно не определено.

Так что на самом деле ясказал бы, что вы должны передать chars напрямую:

match_data(input.chars, sizeof(input.chars));
...