This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Placing size of array at start of array

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
};
This gives the error
warning C198: sizeof returns 0
, so plainly the compiler only does a single pass through the code, and does not know the array size until it has finished parsing the entire array definition. :(

Is there any other way to achieve this? I presume it would be possible with some sort of pre-processor macro to count the number of elements manually before defining the aray...

Parents
  • Hmm, I think you can make use of how Keil arranges/places variables in memory. They are not arranged in order of declaration, they are arranged alphabetically. So, if you declare:

    const unsigned char myarray[] = {1,2,3,4};
    const unsigned int amyarraysize = sizeof(myarray) + 2/*include size of amyarraysize */);

    in one file, with no other declarations. amyarraysize will appear as the first in memory, followed by myarray. (Of cause myarray itself should no longer contain the size ...). Remember to move the pointer to amyarraysize, when copying.

    Now, Im not sure that it will always work, but I think so. If you really want to be sure, use the
    SECTIONS(?NC?YOURFILENAME?NCONST (addr))
    to place it to a fixed place in memory

    Best regards
    Niels Sejersen


Reply
  • Hmm, I think you can make use of how Keil arranges/places variables in memory. They are not arranged in order of declaration, they are arranged alphabetically. So, if you declare:

    const unsigned char myarray[] = {1,2,3,4};
    const unsigned int amyarraysize = sizeof(myarray) + 2/*include size of amyarraysize */);

    in one file, with no other declarations. amyarraysize will appear as the first in memory, followed by myarray. (Of cause myarray itself should no longer contain the size ...). Remember to move the pointer to amyarraysize, when copying.

    Now, Im not sure that it will always work, but I think so. If you really want to be sure, use the
    SECTIONS(?NC?YOURFILENAME?NCONST (addr))
    to place it to a fixed place in memory

    Best regards
    Niels Sejersen


Children
  • A very neat trick Niels, I'll remember that in future.
    It would probably be possible to base a solution on this trick. I now find that externally linked modules needed to know the length also, currently it is defined in a .H file. I could modify the external modules to read the length from the array, but I might just stick with writing a utility to auto-genaerate the .c and .h files, with the length calculated automatically and inserted into the source. This will make the source easier to read (& understand) when the project is complete.

  • It is probably worth creating some validation code to make sure that things are located in memory in the order you wish.

    The symbol table manager uses a hash algorithm that may be changed in the future, so be careful using tricks like this.

    I'm not saying you shouldn't do this. I'm just saying that you should be careful.

    Jon

  • Hmm, I think you can make use of how Keil arranges/places variables in memory. They are not arranged in order of declaration, they are arranged alphabetically.

    This is a painfully bad idea. Not only is it completely unportable, and needlessly so, it will even break with the Keil tool-chain if you tell C51 to keep varables in order via the ORDER directive.

    Write a program to generate the .c and .h files. Then it could be used with other tools.