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.
Hi Ed: I found a bug in one of the compound data type examples. The attached patch fixes it. I'm puzzled by one thing though. Your example for writing an array of ints in a compound type was this:
/* Create a file with a compound type which contains an array of * int. Write a little data. */ if (nc_create(FILE_NAME, NC_NETCDF4, &ncid)) ERR;if (nc_def_compound(ncid, sizeof(struct dim_rec), "SFDimRec", &typeid)) ERR;
if (nc_insert_compound(ncid, typeid, "starfleet_id", HOFFSET(struct dim_rec, starfleet_id), NC_INT)) ERR; if (nc_insert_array_compound(ncid, typeid, "abilities",HOFFSET(struct dim_rec, abilities), NC_INT, 1, dim_sizes)) ERR;
if (nc_def_dim(ncid, STARDATE, DIM_LEN, &dimid)) ERR;if (nc_def_var(ncid, "dimension_data", typeid, 1, dimids, &varid)) ERR;
if (nc_put_var(ncid, varid, dim_data_out)) ERR; if (nc_close(ncid)) ERR; /* Open the file and take a look. */ { if (nc_open(FILE_NAME, NC_WRITE, &ncid)) ERR; if (nc_inq_var(ncid, 0, name, &xtype, &ndims, dimids, &natts)) ERR;/* if (strcmp(name, "starbase_13") || ndims != 1 || natts != 0 || dimids[0] != 0) ERR;
if (nc_inq_compound(ncid, xtype, name, &size, &nfields)) ERR;if (nfields != 5 || size != sizeof(struct sf_med_rec) || strcmp(name, "SFMedRec")) ERR;
if (nc_get_var(ncid, varid, med_data_in)) ERR; for (i=0; i<DIM_LEN; i++) if (med_data_in[i].num_heads != med_data_out[i].num_heads || med_data_in[i].num_arms != med_data_out[i].num_arms || med_data_in[i].num_toes != med_data_out[i].num_toes || med_data_in[i].ago != med_data_out[i].ago || med_data_in[i].num_hairs != med_data_out[i].num_hairs) ERR;*/ if (nc_close(ncid)) ERR; } } I changed the latter part of it to this { if (nc_open(FILE_NAME, NC_WRITE, &ncid)) ERR; if (nc_inq_var(ncid, 0, name, &xtype, &ndims, dimids, &natts)) ERR;if (strcmp(name, "dimension_data") || ndims != 1 || natts != 0 || dimids[0] != 0) ERR;
if (nc_inq_compound(ncid, xtype, name, &size, &nfields)) ERR;if (nfields != 2 || size != sizeof(struct dim_rec) || strcmp(name, "SFDimRec")) ERR;
if (nc_get_var(ncid, varid, dim_data_in)) ERR; for (i=0; i<DIM_LEN; i++){if (dim_data_in[i].starfleet_id != dim_data_out[i].starfleet_id) ERR;
for (j = 0; j < NUM_DIMENSIONS; j++)if (dim_data_in[i].abilities[j] != dim_data_out[i].abilities[j]) ERR;
} if (nc_close(ncid)) ERR; } } This works fine. However, if I insertierr = nc_inq_compound_field(ncid, xtype, 1, name, &offset, &field_xtype, &field_ndims, &field_sizes); printf("%s %d %d %d name type ndims dim1\n",name,field_xtype,field_ndims,field_sizes[0]);
I get abilities 0 0 0 name type ndims dim1I would have expected '4 1 7', since the field is an 1-d array of ints with length 7. I suspect this is a bug in the implementation of arrays as compound type fields, but I may be missing something.
-Jeff -- Jeffrey S. Whitaker Phone : (303)497-6313 NOAA/OAR/CDC R/CDC1 FAX : (303)497-6449 325 Broadway Web : http://www.cdc.noaa.gov/~jsw Boulder, CO, USA 80305-3328 Office: Skaggs Research Cntr 1D-124 ------------------------------------------------------------------------ --- tst_compounds.c.orig Sat Mar 4 14:47:54 2006 +++ tst_compounds.c.new Sat Mar 4 14:47:51 2006 @@ -62,7 +62,7 @@ int starfleet_id; int abilities[NUM_DIMENSIONS]; }; - struct dim_rec dim_data_out[DIM_LEN]; + struct dim_rec dim_data_out[DIM_LEN], dim_data_in[DIM_LEN];/* StarFleet Human Resources Department has data records for all
* employees. */ @@ -281,16 +281,15 @@ { if (nc_open(FILE_NAME, NC_WRITE, &ncid)) ERR; if (nc_inq_var(ncid, 0, name, &xtype, &ndims, dimids, &natts)) ERR; -/* if (strcmp(name, "starbase_13") || ndims != 1 || natts != 0 || dimids[0] != 0) ERR; + if (strcmp(name, "dimension_data") || ndims != 1 || natts != 0 || dimids[0] != 0) ERR; if (nc_inq_compound(ncid, xtype, name, &size, &nfields)) ERR; - if (nfields != 5 || size != sizeof(struct sf_med_rec) || strcmp(name, "SFMedRec")) ERR; - if (nc_get_var(ncid, varid, med_data_in)) ERR; + if (nfields != 2 || size != sizeof(struct dim_rec) || strcmp(name, "SFDimRec")) ERR; + if (nc_get_var(ncid, varid, dim_data_in)) ERR; for (i=0; i<DIM_LEN; i++)- if (med_data_in[i].num_heads != med_data_out[i].num_heads || - med_data_in[i].num_arms != med_data_out[i].num_arms ||
- med_data_in[i].num_toes != med_data_out[i].num_toes || - med_data_in[i].ago != med_data_out[i].ago || - med_data_in[i].num_hairs != med_data_out[i].num_hairs) ERR;*/ + {if (dim_data_in[i].starfleet_id != dim_data_out[i].starfleet_id) ERR; + for (j = 0; j < NUM_DIMENSIONS; j++) + if (dim_data_in[i].abilities[j] != dim_data_out[i].abilities[j]) ERR; + } if (nc_close(ncid)) ERR; } } -- Jeffrey S. Whitaker Phone : (303)497-6313 Meteorologist FAX : (303)497-6449 NOAA/OAR/PSD R/PSD1 Email : Jeffrey.S.Whitaker@xxxxxxxx 325 Broadway Office : Skaggs Research Cntr 1D-124 Boulder, CO, USA 80303-3328 Web : http://tinyurl.com/5telg
netcdfgroup
archives: