Я получаю ошибки приведения при передаче struct
по ссылке. Передача указателя на буфер работает нормально. Функция getstuff()
на самом деле является libusb_claim_interface()
с удаленными ненужными частями. Я пытаюсь вернуть часть данных с USB-устройства, подключенного к машине с Linux.
Данные приходят в соответствии с этим struct
:
typedef struct mystruct {
unsigned char a;
unsigned short b;
unsigned char c;
unsigned char d;
... /* 40 more members of unsigned char */
} mystruct_t;
Однако код, с которым мне дали работать, передает буфер беззнаковых символов. Затем буфер должен установить каждый отдельный член структуры.
Например:
getstuff(unsigned char *data, int length);
void foo(void)
{
unsigned char apple;
unsigned short banana;
unsigned char cherry;
unsigned char date;
...
unsigned char buffer[44];
sendstuff(...);
getstuff(buffer, 44);
apple = buffer[0];
banana = buffer[1];
cherry = buffer[2];
date = buffer[3];
...
}
Вместо этого я хочу фактически определить struct
(выше) и передать ссылку на него, а затем получить разумный доступ к членам, например:
getstuff(unsigned char *data, int length);
void foo(void)
{
unsigned char apple;
unsigned short banana;
unsigned char cherry;
unsigned char date;
...
mystruct_t *fruits;
sendstuff(...);
getstuff((unsigned char) fruits, sizeof(mystruct_t));
apple = fruits->a;
banana = fruits->b;
cherry = fruits->c;
date = fruits->d;
...
}
Но это не работает. Сначала я получаю это при компиляции:
warning: cast from pointer to integer of different size [-Wpointer
-to-int-cast]
(unsigned char) fruits,
warning: passing argument 3 of ‘getstuff’ makes pointer from
integer without a cast [-Wint-conversion]
Затем это (которое выбрасывается при разборе libusb.h
):
note: expected ‘unsigned char *’ but argument is of type ‘unsigned char’
int LIBUSB_CALL libusb_bulk_transfer(libusb_device_handle *dev_handle,
Когда я запускаю программу, устройство, кажется, возвращает 21906 байт вместо ожидаемых 44. Если я передаю фрукты в (unsigned char *
), программа компилируется без проблем, но затем я получаю от 21900 до 22060 байт. Я мог бы «решить» это, просто передав массив беззнаковых символов, как в исходном коде, но затем сделав это, чтобы скопировать указатель на mystruct_t *fruits
:
fruits = (mystruct_t *) buffer;
Но мне бы очень хотелось знать, что происходит и почему у меня так много проблем с созданием структуры.
unsigned char *
, а неunsigned char
, так какgetstuff
ожидаетunsigned char *
. Также похоже, что вам не хватает закрывающей скобки при вызове getstuff. Наконец, пробовали ли вы увидеть, что такоеsizeof mystruct_t
(распечатав или зарегистрировав его)? - person CoffeeTableEspresso   schedule 11.08.2018unsigned char *
.sizeof(mystruct_t)
равно 44, как иbuffer[]
. - person Frotz   schedule 11.08.2018someval = *somePointer
для разыменования,func(&some_value)
для передачи по адресу - person Grady Player   schedule 11.08.2018