We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
Hi all, I am working with the TI TUSB3200, trying to modify their example code for our own USB device. USB requires many tables which start with a length byte. I would like to use the sizeof operator to calculate this for me, as shown here:
byte code rictest[] = { sizeof(rictest), 1, 2 };
warning C198: sizeof returns 0
a dumb (maybe) suggestion: Declare the array twice sArrName[] = {...}; ArrName[] = {sizeof (sArrName), ...}; This could be done even simpler with a macro containing the entire array save the first statement. Erik
Or, just create the array with an empty first element:
unsigned char array [] = { 0, 1, 2, 3, 4, ... };
. . . array[0] = sizeof (array); . . .
Sorry guys, I didn't spell out all my requirements. The table is in read-only ROM, so I can't modify the first element later on. I want to experiment adding and removing entries to these tables, so the length will vary. It seems very labour intensive (and error-prone) to manually count the bytes each time. I was trying to think of some way to make a macro to somehow do a dummy define on the data to work out the size, and then do the real define once it knows the answer, but I can't think of a way to do this without really creating the table (so I would end up with two copies of it). I suppose the last resort solution would be to write a pre-processor in Visual Basic to construct the C source file for me...
You could do something like...
#include <string.h> static unsigned char code descriptor [] = { 1,2,3,4,5,6,7 }; unsigned char xdata xdescriptor [1 + sizeof (descriptor)] = { sizeof (descriptor), }; void main (void) { memcpy (&xdescriptor[1], descriptor, sizeof (descriptor)); }
"read-only ROM" What other sort of ROM is there?! ;-)
Can you make use of strings?
#define RICTEST_STR "\x1\x2" struct rictest_t { byte size; char str[sizeof(RICTEST_STR)]; }; struct rictest_t rictest = { sizeof(struct rictest_t), RICTEST_STR};
Andrew said: : "read-only ROM" : : What other sort of ROM is there?! ;-) What's wrong with a bit of redundancy? :~) It fits in well with "LCD display", "DOS operating System", "PIN number", "USB bus" ...
"What's wrong with a bit of redundancy? :~)" It's not redundancy, it's tautology! "It fits in well with 'LCD display', 'DOS operating System', 'PIN number', 'USB bus' ... Yes, it's exactly the same error - they're all just as bad! ;-)