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.
NOTE: The netcdf-hdf
mailing list is no longer active. The list archives are made available for historical reasons.
Howdy HDF5 folk! Using a recent version of HDF5 from cvs, I encountered the following output from h5dump: HDF5 "tst_h_vl.h5" { GROUP "/" { GROUP "grp1" { DATASET "sea_sounding_dataset" { DATATYPE "/grp1/sea_sounding_type" DATASPACE SIMPLE { ( 3 ) / ( 3 ) } DATA { h5dump error: unable to print data } } DATATYPE "sea_sounding_type" H5T_COMPOUND { H5T_STD_I32LE "sounding_no"; H5T_VLEN { H5T_IEEE_F32LE} "temp_vl"; } } } } The program that produces the file is here (note that it is the second file produced which created the file that h5dump can't handle: /* This is part of the netCDF package. Copyright 2005 University Corporation for Atmospheric Research/Unidata See COPYRIGHT file for conditions of use. This program excersizes HDF5 variable length array code. $Id: tst_h_vl.c,v 1.3 2005/08/11 15:39:57 ed Exp $ */ #include "tests.h" #define FILE_NAME "tst_h_vl.h5" #define DIM1_LEN 3 #define ATT_NAME "att_name" int main() { hid_t fileid, grpid, spaceid, typeid, attid; hsize_t dims[1] = {DIM1_LEN}; hvl_t data[DIM1_LEN]; int *phoney; int i, j; size_t size; /* Create some phoney data, an array of struct s1, which holds a * pointer to a variable length array of int. */ for (i=0; i<DIM1_LEN; i++) { if (!(phoney = malloc(sizeof(int) * i+1))) return NC_ENOMEM; for (j=0; j<i+1; j++) phoney[j] = -99; data[i].p = phoney; data[i].len = i+1; } printf("*** Checking simple HDF5 variable length types..."); /* Open file. */ if ((fileid = H5Fcreate(FILE_NAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0) ERR; if ((grpid = H5Gcreate(fileid, "grp1", 0)) < 0) ERR; /* Create VLEN type. */ if ((typeid = H5Tvlen_create(H5T_NATIVE_INT)) < 0) ERR; /* Although it's a vlen of ints, the size is rouned up to 8. */ if (!(size = H5Tget_size(typeid))) ERR; if (size < 8) ERR; /* Write an attribute of this vlen type. */ if ((spaceid = H5Screate_simple(1, dims, NULL)) < 0) ERR; if ((attid = H5Acreate(grpid, ATT_NAME, typeid, spaceid, H5P_DEFAULT)) < 0) ERR; if (H5Awrite(attid, typeid, data) < 0) ERR; if (H5Aclose(attid) < 0) ERR; if (H5Tclose(typeid) < 0) ERR; if (H5Gclose(grpid) < 0) ERR; if (H5Fclose(fileid) < 0) ERR; SUMMARIZE_ERR; printf("*** Checking array of compound holding a vlen..."); { hid_t vlen_typeid, compound_typeid, spaceid, datasetid; struct sea_sounding { int sounding_no; hvl_t temp_vl; } data[DIM1_LEN]; float *phoney; int i, j; /* Create phoney data. */ for (i=0; i<DIM1_LEN; i++) { if (!(phoney = malloc(sizeof(float) * i+1))) return NC_ENOMEM; for (j=0; j<i+1; j++) phoney[j] = 23.5 - j; data[i].temp_vl.p = phoney; data[i].temp_vl.len = i+1; } /* Create file. */ if ((fileid = H5Fcreate(FILE_NAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0) ERR; if ((grpid = H5Gcreate(fileid, "grp1", 0)) < 0) ERR; /* Create VLEN type. */ if ((vlen_typeid = H5Tvlen_create(H5T_NATIVE_FLOAT)) < 0) ERR; /* Create a compound type that holds the vlen type. */ if ((compound_typeid = H5Tcreate(H5T_COMPOUND, sizeof(struct sea_sounding))) < 0) ERR; if (H5Tinsert(compound_typeid, "sounding_no", HOFFSET(struct sea_sounding, sounding_no), H5T_NATIVE_INT) < 0) ERR; if (H5Tinsert(compound_typeid, "temp_vl", HOFFSET(struct sea_sounding, temp_vl), vlen_typeid) < 0) ERR; if (H5Tcommit(grpid, "sea_sounding_type", compound_typeid) < 0) ERR; if ((spaceid = H5Screate_simple(1, dims, NULL)) < 0) ERR; if ((datasetid = H5Dcreate(grpid, "sea_sounding_dataset", compound_typeid, spaceid, H5P_DEFAULT)) < 0) ERR; if (H5Dwrite(datasetid, compound_typeid, H5S_ALL, H5S_ALL, H5P_DEFAULT, data) < 0) ERR; if (H5Dclose(datasetid) < 0) ERR; if (H5Tclose(compound_typeid) < 0) ERR; if (H5Tclose(vlen_typeid) < 0) ERR; if (H5Sclose(spaceid) < 0) ERR; if (H5Gclose(grpid) < 0) ERR; 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
netcdf-hdf
archives: