Передача массива в функцию обратного вызова в параметре void - PullRequest
0 голосов
/ 07 марта 2020

A имеет функцию обратного вызова с этим прототипом:

void serverAnswer(void *pUserData, int flag);

Мне нужно передать буфер const uint8_t *buf этой функции с помощью параметра void. Как передать буфер и как получить доступ к элементам буфера в функции?

Пример (не работает):

Вызов:

const uint8_t *buf;
int buf_len = 3;
serverAnswer(&buf, buf_len);

Доступ к буферу:

void serverAnswer(void *pUserData, int flag) {

uint8_t* p = (uint8_t *)pUserData;
uint8_t data = p[0];

}

Ответы [ 2 ]

0 голосов
/ 07 марта 2020

Вы фактически передаете указатель на массив во время вашего вызова. В вашем коде то, что вы приводите к uint8_t*, это uint8_t**.

Что вам нужно сделать, это либо передать массив напрямую, либо привести его к uint8_t** вместо uint8_t* и разыменование его.

ИМХО, передача массива напрямую является лучшим способом для go, поскольку передача указателя на указатель не требуется, если вы не хотите изменять указатель, что, кажется, ваш случай

0 голосов
/ 07 марта 2020

&buf является const uint8_t **. Что вы действительно хотите сделать, это передать buf в serverAnswer, вам понадобится const_cast, чтобы разрешить преобразование из указателя const в void*:

const uint8_t* buf;
serverAnswer(const_cast<uint8_t*>(buf), buf_len);

Во избежание неопределенности поведение вы должны положить const обратно в serverAnswer:

void serverAnswer(void *pUserData, int flag) {

const uint8_t* p = (const uint8_t *)pUserData;
uint8_t data = p[0];

}
...