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.

Re: 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.

also, a quick look at your code shows that while reading to memory you are 
using the 
type on disk
/* Get type. */ 
if ((typeid = H5Dget_type(datasetid)) < 0) ERR;

see H5TB_create_type and H5TBread_table on the mentioned files



At 10:39 AM 4/28/2005, you wrote:
>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

</Pedro Vicente Nunes>
--------------------------------------------------------------
hdf.ncsa.uiuc.edu
Tel. 1-217-265 0311







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