Hi Martin.

On Fri, Apr 08, 2011 at 02:59:59PM +0100, Martin Galpin wrote:
> I am not using a "blob" and indeed using a H5T_COMPOUND type that is
> built using the constituents of the structure.
> 
> So, in the case of:
> 
> // C
> struct A
> {
>   int x;
>   int y;
> };
> 
> struct Container
> {
>   int offset;
>   struct A element;
> }
> 
> It would be:
> 
> H5insert... H5T_NATIVE_INT32, H5T_NATIVE_INT32, H5T_NATIVE_INT32 (offset, x, 
> y).

Not really sure what this means;-) If this is the in-memory layout
then it might just be working because in this case the in-memory
layout of the structure is really that simple, i.e. just three
ints, one after another. I wouldn't like to bet that it is that
simple in all possible cases... BTW, if this is really about the
in-memory layout, why are you using 'H5T_NATIVE_INT32' instead of
'H5T_NATIVE_INT'?

> With this approach I can H5PTappend a Container* packet directly to
> the compound type. Should I be creating nested compound types for the
> nested structures?

If you want to retain the nested-ness of the structure in the
HDF file then I would say yes, definitely. To simplify the dis-
cussion I wrote a shot program that just writes out a single
instance of your nested structure and then reading it back in:

--------8<----------------------------------
#include <stdio.h>
#include <hdf5.h>

typedef struct A
{
    int x;
    int y;
} A_t;

typedef struct Container
{
    int offset;
    A_t element;
} Container_t;

int
main( )
{
    Container_t s = { 16, { 19, -21 } };
    hid_t       file, 
                space,
                dset,
                A_filetype,
                A_memtype,
                C_filetype,
                C_memtype;
    hsize_t     dims[ 1 ] = { 1 };
    int         ndims;

        /* Print out the original contents of the structure */

    printf( "Before: { %d, { %d, %d } }\n",
            s.offset, s.element.x, s.element.y );

    /* Create data type with in-memory layout of the A structure */

    A_memtype = H5Tcreate( H5T_COMPOUND, sizeof( A_t ) );
    H5Tinsert( A_memtype, "x", HOFFSET( A_t, x ), H5T_NATIVE_INT );
    H5Tinsert( A_memtype, "y", HOFFSET( A_t, y ), H5T_NATIVE_INT );

    /* Create data type with in-memory layout of the Container structure */

    C_memtype = H5Tcreate( H5T_COMPOUND, sizeof( Container_t ) );
    H5Tinsert( C_memtype, "offset", HOFFSET( Container_t, offset ),
               H5T_NATIVE_INT );
    H5Tinsert( C_memtype, "element", HOFFSET( Container_t, element ),
               A_memtype );

    /* Create data type with in-file layout of the A structure */

    A_filetype = H5Tcreate( H5T_COMPOUND, 2 * H5Tget_size( H5T_NATIVE_INT32 ) );
    H5Tinsert( A_filetype, "x", 0, H5T_NATIVE_INT32 );
    H5Tinsert( A_filetype, "y", H5Tget_size( H5T_NATIVE_INT32 ),
               H5T_NATIVE_INT32 );

    /* Create data type with in-file layout of the Container structure */

    C_filetype = H5Tcreate( H5T_COMPOUND,
                              H5Tget_size( H5T_NATIVE_INT32 )
                            + H5Tget_size( A_filetype ) );
    H5Tinsert( C_filetype, "offset", 0, H5T_NATIVE_INT32 );
    H5Tinsert( C_filetype, "element", H5Tget_size( H5T_NATIVE_INT32 ),
               A_filetype );

    /* Open a file for writing */

    file = H5Fcreate( "ctest.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT );

    /* Create a dataspace and the dataset */

    space = H5Screate_simple( 1, dims, NULL );
    dset = H5Dcreate2( file, "test set", C_filetype, space,
                       H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT );

    /* Write the structure out */

    H5Dwrite( dset, C_memtype, H5S_ALL, H5S_ALL, H5P_DEFAULT, &s );

    /* Get rid of resources and close the file */

    H5Dclose( dset );
    H5Sclose( space );
    H5Tclose( C_filetype );
    H5Tclose( A_filetype );
    H5Fclose( file );

    /* Clear out the structure and print it to show it's all 0 now */

    s.offset = s.element.x = s.element.y = 0;
    printf( "After clear: { %d, { %d, %d } }\n",
            s.offset, s.element.x, s.element.y );

    /* Now the reverse (re-using the in-memory layout of the structure,
       the in-file layout is in the file, so it doesn't need to be re-
       created) */

    file = H5Fopen( "ctest.h5", H5F_ACC_RDONLY, H5P_DEFAULT );
    dset = H5Dopen2( file, "test set", H5P_DEFAULT );
    space = H5Dget_space( dset );
    ndims = H5Sget_simple_extent_dims( space, dims, NULL );
    H5Dread( dset, C_memtype, H5S_ALL, H5S_ALL, H5P_DEFAULT, &s );

    H5Dclose( dset );
    H5Sclose( space );
    H5Tclose( C_memtype );
    H5Tclose( A_memtype );
    H5Fclose( file );

    /* Show that the structure again contains the original data */

    printf( "Finally: { %d, { %d, %d } }\n",
            s.offset, s.element.x, s.element.y );

    return 0;
}
--------8<----------------------------------

Please keep in mind that this was my first attempt at trying to
deal with compounds containing compounds, so there might be some
bugs lurking...
                            Best regards, Jens
-- 
  \   Jens Thoms Toerring  ________      [email protected]
   \_______________________________      http://toerring.de

_______________________________________________
Hdf-forum is for HDF software users discussion.
[email protected]
http://mail.hdfgroup.org/mailman/listinfo/hdf-forum_hdfgroup.org

Reply via email to