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.
Ed Hartnett wrote:
Ed: I'm not sure if this is the part of the same bug, or a different one. Attached is a C program that generates a compound variable from a struct containing a 16 bit integer and a 64 bit integer. If I use the gcc __packed__ attribute to turn off the padding for memory alignment, I get this from an ncdump of the resulting file:Howdy Jeff, Just an update: we have confirmed this bug and I am working on it now. I have also added this to our automatic testing, so that we can see it break here on our test machines, and ensure that once it's fixed, it doesn't break again. I will let you know when this fix is available in the snapshot - hopefully not more than a few days from now... Thanks again for find this! Ed
data: phony_var = {20000, 844424930431968} ; whereas the correct result data: phony_var = {20000, 30000} ;is obtained when the __packed__ attribute is not set and padding is added for memory alignment. However, as I noted in my original report, the file is not readable on platforms with a different default memory alignment.
This probably is the same bug, but if so this example shows how to trigger it without having access to multiple platforms.
-Jeff -- 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-113 Boulder, CO, USA 80303-3328 Web : http://tinyurl.com/5telg
#include <stdlib.h> #include <stdio.h> #include "netcdf.h" #define ERRCODE 2 #define ERR(e) {printf("Error: %s\n", nc_strerror(e)); exit(ERRCODE);} int main() { int ncid, typeid, varid, dimid, retval; char name[NC_MAX_NAME + 1]; int dimids[] = {0}; struct s1 { short i; long long j; /*};*/ } __attribute__ ((__packed__)); struct s1 data[1]; /* Create some phony data. */ data[0].i = 20000; data[0].j = 300000; /* Create a file with a compound type. Write a little data. */ if ((retval = nc_create("test.nc", NC_NETCDF4, &ncid))) ERR(retval);; printf("size of compound %d\n",sizeof(struct s1)); if ((retval = nc_def_compound(ncid, sizeof(struct s1), "cmp1", &typeid))) ERR(retval);; printf("offset i %d\n",NC_COMPOUND_OFFSET(struct s1,i)); if ((retval = nc_insert_compound(ncid, typeid, "i", NC_COMPOUND_OFFSET(struct s1, i), NC_SHORT))) ERR(retval);; printf("offset j %d\n",NC_COMPOUND_OFFSET(struct s1,j)); if ((retval = nc_insert_compound(ncid, typeid, "j", NC_COMPOUND_OFFSET(struct s1, j), NC_INT64))) ERR(retval);; if ((retval = nc_def_dim(ncid, "phony_dim", 1, &dimid))) ERR(retval); if ((retval = nc_def_var(ncid, "phony_var", typeid, 1, dimids, &varid))) ERR(retval); nc_put_var(ncid, varid, data); nc_close(ncid); }
netcdfgroup
archives: