1/* This is part of the netCDF package.  Copyright 2005 University
2   Corporation for Atmospheric Research/Unidata See COPYRIGHT file for
3   conditions of use.
4
5   This program excersizes HDF5 variable length array code.
6
7   $Id: tst_h_vl2.c,v 1.5 2010/06/01 15:34:52 ed Exp $
8*/
9
10/* This test was added to help diagnose the issue described at:
11 *    * https://github.com/Unidata/netcdf-c/issues/221
12 * This issue was originally reported by the python group at:
13 *    * https://github.com/Unidata/netcdf4-python/issues/527
14 */
15
16
17#include <nc_tests.h>
18#include "err_macros.h"
19#include <hdf5.h>
20#include <nc_logging.h>
21
22#define FILE_NAME_UNLIM "tst_empty_vlen_unlim.nc"
23#define FILE_NAME_LIM "tst_empty_vlen_lim.nc"
24#define DIM_LEN_UNLIM NC_UNLIMITED
25#define DIM_LEN_LIM 5
26#define DIM_NAME "x"
27#define VLEN_NAME "vltest"
28#define VAR_NAME1 "v"
29#define VAR_NAME2 "w"
30#define ROW_COUNT 3
31#define VLEN0 2
32#define VLEN1 3
33#define VLEN2 3
34
35int main() {
36
37  printf("Testing access to unset entries in VLEN variable, unlimited dimension\n");
38  {
39    int ncidtypeiddimidvaridvarid2;
40    nc_vlen_t data[ROW_COUNT];
41    int stat;
42    float *dat0, *dat1, *dat2;
43    float *data2;
44    size_t startp[3] = {0,0,0};
45    size_t countp[3] = {VLEN0,VLEN1,VLEN2};
46    size_t startp2[1] = {0};
47    size_t countp2[1] = {VLEN2};
48    int i = 0;
49    /* Create File */
50    printf("\t* Creating File:\tnc_create()\n");
51    if (nc_create(FILE_NAME_UNLIMNC_NETCDF4 | NC_CLOBBER, &ncid)) ERR;
52
53    /* Set fill mode */
54    //printf("\t* Setting fill mode:\tnc_set_fill()\n");
55    //if(nc_set_fill(ncid,NC_FILL,NULL)) ERR;
56
57    /* Create Dimension */
58    printf("\t* Defining Unlimited Dimension:\tnc_def_dim()\n");
59    if (nc_def_dim(ncidDIM_NAMEDIM_LEN_UNLIM, &dimid)) ERR;
60
61    /* Create ragged array type. */
62    printf("\t* Creating Ragged Array type:\tnc_def_vlen().\n");
63    if (nc_def_vlen(ncidVLEN_NAMENC_FLOAT, &typeid)) ERR;
64
65    /* Create a variable of typeid. */
66    printf("\t* Creating Variable using Ragged Arrayt Type:\tnc_def_var().\n");
67    if (nc_def_var(ncidVAR_NAME1typeid, 1, &dimid, &varid)) ERR;
68
69    /* Create a variable of type float. */
70    printf("\t* Creating secondary Variable using NC_FLOAT:\tnc_def_var().\n");
71    if (nc_def_var(ncidVAR_NAME2NC_FLOAT, 1, &dimid, &varid2)) ERR;
72
73    /* End define mode. */
74    printf("\t* Ending define mode:\tnc_enddef().\n");
75
76    /* Write out data for w */
77    printf("\t* Creating float data for secondary variable.\n");
78    data2 = (float*)malloc(sizeof(float) * VLEN2);
79    for(i = 0; i < VLEN2i++) {
80      data2[i] = (float)i;
81    }
82
83    printf("\t* Puting data in secondary variable:\tnc_put_vara().\n");
84    if (nc_put_vara(ncid,varid2,startp2,countp2,data2)) ERR;
85
86    /***********/
87    /* Actually unnecessary to recreate the issue. */
88    /***********/
89
90
91    /* Write out varying-length data for v[0] and v[1]. Leave v[2] empty. */
92
93    dat0 = (float*)malloc(VLEN0 * sizeof(float));
94    for(i = 0; i < VLEN0i++) {
95      dat0[i] = (float)i;
96    }
97    dat1 = (float*)malloc(VLEN1 * sizeof(float));
98    for(i = 0; i < VLEN1i++) {
99      dat1[i] = (float)i;
100    }
101    dat2 = (float*)malloc(VLEN2 * sizeof(float));
102    for(i = 0; i < VLEN2i++) {
103      dat2[i] = (float)i;
104    }
105
106    data[0].p = dat0;
107    data[0].len = VLEN0;
108
109    data[1].p = dat1;
110    data[1].len = VLEN1;
111
112    data[2].p = dat2;
113    data[2].len = VLEN2;
114
115    //printf("\t* Puting data in VLEN variable:\tnc_put_vara().\n");
116    //stat = nc_put_vara(ncid,varid,&startp,&countp,data);
117    //stat = nc_put_var(ncid,varid,&data);
118    //if(stat) ERR;
119
120
121
122    /* Close File. */
123    printf("\t* Closing file:\tnc_close().\n");
124    if ((stat = nc_close(ncid))) ERR;
125
126
127  }
128
129  printf("Testing access to unset entries in VLEN variable, unlimit dimension\n");
130  {
131    int ncidtypeiddimidvaridvarid2;
132    nc_vlen_t data[ROW_COUNT];
133    int stat;
134    float *dat0, *dat1, *dat2;
135    float *data2;
136    size_t startp[3] = {0,0,0};
137    size_t countp[3] = {VLEN0,VLEN1,VLEN2};
138    size_t startp2[1] = {0};
139    size_t countp2[1] = {VLEN2};
140    int i = 0;
141    /* Create File */
142    printf("\t* Creating File:\tnc_create()\n");
143    if (nc_create(FILE_NAME_LIMNC_NETCDF4 | NC_CLOBBER, &ncid)) ERR;
144
145    /* Set fill mode */
146    //printf("\t* Setting fill mode:\tnc_set_fill()\n");
147    //if(nc_set_fill(ncid,NC_FILL,NULL)) ERR;
148
149    /* Create Dimension */
150    printf("\t* Defining Unlimited Dimension:\tnc_def_dim()\n");
151    if (nc_def_dim(ncidDIM_NAMEDIM_LEN_LIM, &dimid)) ERR;
152
153    /* Create ragged array type. */
154    printf("\t* Creating Ragged Array type:\tnc_def_vlen().\n");
155    if (nc_def_vlen(ncidVLEN_NAMENC_FLOAT, &typeid)) ERR;
156
157    /* Create a variable of typeid. */
158    printf("\t* Creating Variable using Ragged Arrayt Type:\tnc_def_var().\n");
159    if (nc_def_var(ncidVAR_NAME1typeid, 1, &dimid, &varid)) ERR;
160
161    /* Create a variable of type float. */
162    printf("\t* Creating secondary Variable using NC_FLOAT:\tnc_def_var().\n");
163    if (nc_def_var(ncidVAR_NAME2NC_FLOAT, 1, &dimid, &varid2)) ERR;
164
165    /* End define mode. */
166    printf("\t* Ending define mode:\tnc_enddef().\n");
167
168    /* Write out data for w */
169    printf("\t* Creating float data for secondary variable.\n");
170    data2 = (float*)malloc(sizeof(float) * VLEN2);
171    for(i = 0; i < VLEN2i++) {
172      data2[i] = (float)i;
173    }
174
175    printf("\t* Puting data in secondary variable:\tnc_put_vara().\n");
176    if (nc_put_vara(ncid,varid2,startp2,countp2,data2)) ERR;
177
178    /***********/
179    /* Actually unnecessary to recreate the issue. */
180    /***********/
181
182
183    /* Write out varying-length data for v[0] and v[1]. Leave v[2] empty. */
184
185    dat0 = (float*)malloc(VLEN0 * sizeof(float));
186    for(i = 0; i < VLEN0i++) {
187      dat0[i] = (float)i;
188    }
189    dat1 = (float*)malloc(VLEN1 * sizeof(float));
190    for(i = 0; i < VLEN1i++) {
191      dat1[i] = (float)i;
192    }
193    dat2 = (float*)malloc(VLEN2 * sizeof(float));
194    for(i = 0; i < VLEN2i++) {
195      dat2[i] = (float)i;
196    }
197
198    data[0].p = dat0;
199    data[0].len = VLEN0;
200
201    data[1].p = dat1;
202    data[1].len = VLEN1;
203
204    data[2].p = dat2;
205    data[2].len = VLEN2;
206
207    //printf("\t* Puting data in VLEN variable:\tnc_put_vara().\n");
208    //stat = nc_put_vara(ncid,varid,&startp,&countp,data);
209    //stat = nc_put_var(ncid,varid,&data);
210    //if(stat) ERR;
211
212
213
214    /* Close File. */
215    printf("\t* Closing file:\tnc_close().\n");
216    if ((stat = nc_close(ncid))) ERR;
217
218
219  }
220
221
222  SUMMARIZE_ERR;
223  FINAL_RESULTS;
224
225}


HyperKWIC - Version 7.20DA executed at 11:37 on 27 Oct 2017 | Polyhedron Solutions - INTERNAL USE | COMMERCIAL (Any O/S) SN 4AKIed