#c #casting
#c #Кастинг
Вопрос:
У меня есть последовательный порт, возвращающий uint8 следующим образом
uint8 bucket[255];
res = COM.com_read((char *)amp;bucket);
как я могу передать указатель bucket в указатель buff в функции, приведенной ниже:
ssize_t send(int s, const void *buf, size_t len, int flags);
Ответ №1:
amp;
не требуется в com_read
, и вы должны написать это:
//after removing 'amp;'
//bucket being an array converts to pointer automatically
res = COM.com_read((char *)bucket); //Dont use amp;
Или, даже лучшее приведение было бы static_cast
:
res = COM.com_read(static_cast<char*>(bucket)); //C Style cast!
И при отправке bucket
в send
вам не нужно приводить. Это делается компилятором неявно, потому что целевой тип является void*
, и любой указатель может неявно преобразовываться в void*
.
Комментарии:
1. по какой-то странной причине я привел as (const char *), и это работает, однако я привел static_cast<char *> (bucket), и это не сработало.
2. @user945511: Опубликуйте подпись
com_read
. Кроме того, что вы подразумеваете под «это не сработало»? Это выдало ошибку компиляции или что?3. это подпись: int RS_232::com_read(char * xchg_space). это выдало ошибку «может
t cast uint8 to char*", but this error is shown not in
выполнять функцию com_read`, но в «send(int s, const void * buf, size_t len, флаги int)»
Ответ №2:
Приведение не требуется, оно выполняется неявно (любой указатель может быть приведен к const void*
неявно).
Обратите внимание, что при явном приведении следует отдавать предпочтение операторам приведения C :
res = COM.com_read(static_cast<char *>(bucket));
Ответ №3:
Static_cast выполнит трюк с void * и из void *, но вы уверены, что вам нужно явное приведение? Я думаю, что это должно быть сделано неявно для вас
static_cast<void *>(bucket)
Комментарии:
1. у меня следующая ошибка в обоих направлениях (приведение и без приведения): Несколько маркеров в этой строке — инициализирующий аргумент 1 ‘size_t strlen(const char *)’ — недопустимое преобразование из ‘uint8 *’ в ‘const char *’