NOTICE: This version of the NSF Unidata web site (archive.unidata.ucar.edu) is no longer being updated.
Current content can be found at unidata.ucar.edu.

To learn about what's going on, see About the Archive Site.

compound types on different machines - is this expected?

NOTE: The netcdf-hdf mailing list is no longer active. The list archives are made available for historical reasons.

Howdy HDF5 People!

I have a program called tst_h_wrt_cmp, which write a little array of a
compound type.

Then I have another program called tst_h_rd_cmp.c, which reads them
back in and checks the value. This works on any one machine, but when
I run tst_h_wrt_cmp on a Sun, and try to read the resulting file on a
Linux machine, I get garbled data because the two machines use
different padding for the struct.

Is this expected behavior?

tst_h_wrt_cmp.c:


#include "tests.h"

#define FILE_NAME "tst_h_wrt_cmp.h5"
#define DIM1_LEN 3
#define COMPOUND_NAME "cmp"
#define VAR_NAME "var"

int
main()
{
   hid_t fileid, access_plist, spaceid, typeid;
   hid_t datasetid, datasetid1, typeid1;
   int bool_out[DIM1_LEN] = {0, 1, 0}, bool_in[DIM1_LEN];
   hsize_t dims[1];
   struct s1 {
         unsigned char c1;
         double d;
   } data[DIM1_LEN];
   int i;

   for (i=0; i<DIM1_LEN; i++)
   {
      data[i].c1 = 126;
      data[i].d = -9999999;
   }

   printf("*** Checking packing of HDF5 compound types...");
   
   /* Open file and create group. */
   if ((access_plist = H5Pcreate(H5P_FILE_ACCESS)) < 0) ERR;
   if (H5Pset_fclose_degree(access_plist, H5F_CLOSE_STRONG)) ERR;
   if ((fileid = H5Fcreate(FILE_NAME, H5F_ACC_TRUNC, H5P_DEFAULT, 
                           access_plist)) < 0) ERR;

   /* Create a simple compound type. */
   if ((typeid = H5Tcreate(H5T_COMPOUND, sizeof(struct s1))) < 0) ERR;
   if (H5Tinsert(typeid, "c1", HOFFSET(struct s1, c1), H5T_NATIVE_UCHAR) < 0) 
ERR;
   if (H5Tinsert(typeid, "d", HOFFSET(struct s1, d), H5T_NATIVE_DOUBLE) < 0) 
ERR;
   if (H5Tcommit(fileid, COMPOUND_NAME, typeid) < 0) ERR;

   /* Create a space. */
   dims[0] = DIM1_LEN;
   if ((spaceid = H5Screate_simple(1, dims, dims)) < 0) ERR;

   /* Create a dataset of this compound type. */
   if ((datasetid = H5Dcreate(fileid, VAR_NAME, typeid, spaceid, 
                              H5P_DEFAULT)) < 0) ERR;

   /* Write some data. */
   if (H5Dwrite(datasetid, typeid, H5S_ALL, H5S_ALL, 
                H5P_DEFAULT, data) < 0) ERR;

   /* Release all resources. */
   if (H5Fclose(fileid) < 0) ERR;

   SUMMARIZE_ERR;

   /* Print out our number of errors, if any, and exit badly. */
   if (total_err)
   {
      printf("%d errors detected! Sorry!\n", total_err);
      return 2;
   }
   
   printf("*** Tests successful!\n");
   return 0;
}


tst_h_rd_cmp.c:

#include "tests.h"

#define FILE_NAME "tst_h_wrt_cmp.h5"
#define DIM1_LEN 3
#define COMPOUND_NAME "cmp"
#define VAR_NAME "var"

int
main()
{
   hid_t fileid, access_plist, spaceid, typeid;
   hid_t datasetid, datasetid1, typeid1;
   int bool_out[DIM1_LEN] = {0, 1, 0}, bool_in[DIM1_LEN];
   hsize_t dims[1];
   struct s1 {
         unsigned char c1;
         double d;
   } data[DIM1_LEN];
   int i;

   printf("*** Checking packing of HDF5 compound types...");
   
   /* Open file. */
   if ((access_plist = H5Pcreate(H5P_FILE_ACCESS)) < 0) ERR;
   if (H5Pset_fclose_degree(access_plist, H5F_CLOSE_STRONG)) ERR;
   if ((fileid = H5Fopen(FILE_NAME, H5F_ACC_RDONLY, access_plist)) < 0) ERR;

   /* Open dataset. */
   if ((datasetid = H5Dopen(fileid, VAR_NAME)) < 0) ERR;

   /* Check space. */
   if ((spaceid = H5Dget_space(datasetid)) < 0) ERR;
   if (H5Sget_simple_extent_ndims(spaceid) != 1) ERR;
   if (H5Sget_simple_extent_npoints(spaceid) != DIM1_LEN) ERR;

   /* Get type. */
   if ((typeid = H5Dget_type(datasetid)) < 0) ERR;

   /* Read the data. */
   if (H5Dread(datasetid, typeid, H5S_ALL, H5S_ALL, 
               H5P_DEFAULT, data) < 0) ERR;

   /* Check the data. */
   for (i=0; i<DIM1_LEN; i++)
      if (data[i].c1 != 126 || data[i].d != -9999999) ERR;

   /* Release all resources. */
   if (H5Fclose(fileid) < 0) ERR;

   SUMMARIZE_ERR;

   /* Print out our number of errors, if any, and exit badly. */
   if (total_err)
   {
      printf("%d errors detected! Sorry!\n", total_err);
      return 2;
   }
   
   printf("*** Tests successful!\n");
   return 0;
}

-- 
Ed Hartnett  -- ed@xxxxxxxxxxxxxxxx


  • 2005 messages navigation, sorted by:
    1. Thread
    2. Subject
    3. Author
    4. Date
    5. ↑ Table Of Contents
  • Search the netcdf-hdf archives: