I get casting errors when passing a struct
by reference. Passing a pointer to a buffer works fine. The function getstuff()
is actually libusb_claim_interface()
with irrelevant parts removed. I am trying to get a chunk of data back from a USB device plugged into a Linux machine.
The data comes in according to this struct
:
typedef struct mystruct {
unsigned char a;
unsigned short b;
unsigned char c;
unsigned char d;
... /* 40 more members of unsigned char */
} mystruct_t;
However, the code I was given to work with passes a buffer of unsigned chars. The buffer then needs to set each individual struct member.
For instance:
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];
...
}
Rather than doing that, I want to actually define a struct
(above) and pass a reference to that and then access the members sensibly, like this:
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;
...
}
But that doesn't work. First I get this when compiling:
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]
Then, this (which is thrown out when libusb.h
is parsed):
note: expected ‘unsigned char *’ but argument is of type ‘unsigned char’
int LIBUSB_CALL libusb_bulk_transfer(libusb_device_handle *dev_handle,
When I run the program, the device seems to send back 21906 bytes instead of the expected 44. If I cast fruits to (unsigned char *
), the program compiles without complaint, but then I get back anywhere from 21900 to 22060 bytes. I could "solve" this by simply passing an array of unsigned chars like in the original code, but then doing this to copy the pointer to mystruct_t *fruits
:
fruits = (mystruct_t *) buffer;
But I'd really like to know what's going on and why I'm having so much trouble casting the struct.