PG1,
Indeed it is safe to assume struct is contiguous in flash, the same like array of chars. But if you are going to send it as is as a binary to PC or to some other device, then of course you should consider padding bytes inserted to align misaligned struct members. Butr CW 16-bit compilers don't insert any padding bytes (except CW for XGATE and optional enable of struct padding on S12X, which is off by default).
I wonder how are you going to use this heterogenous struct? Are you 1) just sending it as binary to PC or some networked device? Or indeed 2) you are accessing these floats and doubles somehow? For 1st, with the help of preprocessor you could both declare and define your struct in some header file like comes below. I'm using it, and it greatly simplifies the task. One inconvenience is that you need to enumerate your records somehow, becouse you can't have two or more struct members with the same name. So if it is what you need, you do header like below and include it twice in your C file, one time with define_data not defined and 2nd time with define_data defined... . Let me know if this is what you need and and if you need the help
#ifdef define_data
.. define macro for initializer of float record floatrec(..)
.. define macro for initializer of fdouble record doublerec(..)
... struct define header like typedef struct {
#else // declare data
.. define macro for declaration of float_record floatrec(...)
.. define macro for declaration of fdouble record doublerec(..)
... struct declare header like const mydataT mydata={
#endif
////////////////// define you data here /////
floatrec( uniqueid1, 1.34)
doublerec(uniqueid2, 2.45)
floatrec2( uniqueid3, 1.34, 3.44)
...
/////////////////////////////////////////////////////////
#ifdef define_data
... struct define header
#else // declare data
... struct declare header
#endif
.. undefine macro floatrec(...)
.. undefine macro doublerec(..)