1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
|
#define AFIRST
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "netcdf.h"
#define AFIRST
#undef DEBUG
#define FILE "tst_charvlenbug.nc"
void checkErrorCode(int status, const char* message){
if (status != NC_NOERR){
fprintf(stderr,"Error code: %d: %s\n",status,message);
}
}
int
main(int argc, const char * argv[])
{
int ncid;
int retval;
int dimid_a;
int dimid_b;
int dimids[2];
int varid;
int typeid;
int ndims, dimids_read[NC_MAX_VAR_DIMS];
size_t dimlen;
size_t num_items;
ptrdiff_t stride[2] = {1, 1};
nc_vlen_t vlenPointers[4];
nc_vlen_t* readVlenPointers;
int i;
#ifdef AFIRST
size_t start[2] = {1, 0};
size_t count[2] = {2, 2};
#else
size_t start[2] = {0, 1};
size_t count[2] = {2, 2};
#endif
// set up data
vlenPointers[0].len = 1; vlenPointers[0].p = "a";
vlenPointers[1].len = 2; vlenPointers[1].p = "aa";
vlenPointers[2].len = 1; vlenPointers[2].p = "b";
vlenPointers[3].len = 2; vlenPointers[3].p = "bb";
// -- WRITE --
retval = nc_create(FILE, NC_NETCDF4, &ncid);
checkErrorCode(retval, "nc_create");
// Define dimensions
retval = nc_def_dim(ncid, "a", NC_UNLIMITED, &dimid_a);
checkErrorCode(retval, "nc_def_dim for 'a'");
retval = nc_def_dim(ncid, "b", 4, &dimid_b);
checkErrorCode(retval, "nc_def_dim for 'b'");
/* Define VLEN type */
retval = nc_def_vlen(ncid,"str",NC_CHAR,&typeid);
checkErrorCode(retval, "nc_def_vlen");
// Define variable
#ifdef AFIRST
dimids[0] = dimid_a;
dimids[1] = dimid_b;
#else
dimids[0] = dimid_b;
dimids[1] = dimid_a;
#endif
retval = nc_def_var(ncid, "var", typeid, 2, dimids, &varid);
checkErrorCode(retval, "nc_def_var");
// Put variable
retval = nc_put_vars(ncid, varid, start, count, stride, vlenPointers);
// retval = nc_put_vara_string(ncid, varid, start, count, vlenPointers);
checkErrorCode(retval, "nc_put_vars_string");
retval = nc_close(ncid);
checkErrorCode(retval, "nc_close(1)");
// -- READ --
retval = nc_open(FILE, NC_NOWRITE, &ncid);
checkErrorCode(retval, "nc_open");
// get dimensions
retval = nc_inq_var(ncid, varid, NULL, NULL, &ndims, dimids_read, NULL);
checkErrorCode(retval, "nc_inq_var");
// calculate num elements to read
dimlen = 0;
num_items = 1;
for (i = 0; i < ndims; i++) {
retval = nc_inq_dimlen(ncid, dimids_read[i], &dimlen);
checkErrorCode(retval, "nc_inq_dimlen");
num_items *= dimlen;
}
// get var
readVlenPointers = (nc_vlen_t*)malloc(sizeof(nc_vlen_t)*num_items);
retval = nc_get_var(ncid, varid, readVlenPointers);
checkErrorCode(retval, "nc_get_var");
#ifdef DEBUG
for(i=0;i<num_items;i++) {
int j;
char* s;
nc_vlen_t* v = &readVlenPointers[i];
fprintf(stderr,"readVlenPointers[%d] = ",i);
fprintf(stderr,"(%d,%p)",(int)v->len,v->p);
fprintf(stderr," \"");
s = (char*)v->p;
for(j=0;j<v->len;j++) fprintf(stderr,"%c",s[j]);
fprintf(stderr,"\"\n");
}
#endif
if((retval = nc_reclaim_data(ncid,typeid,readVlenPointers,num_items))) goto done;
free(readVlenPointers);
retval = nc_close(ncid);
checkErrorCode(retval, "nc_close(2)");
done:
return retval;
}
|