vd_ex4.c
/* vd_ex4.c
* Create a 4 field Vdata. Record values are stored in
* an array of structure.
* Use VDfpack to pack the field values fully interlaced
* into a buffer. Each VDfpack call packs 1 record.
* Write out NRECORDS (20) records by 1 VSwrite call.
*/
#include "hdf.h"
#include "vg.h"
#include
#define NRECORDS 20
#define FIELD_1 "Temp"
#define FIELD_2 "Height"
#define FIELD_3 "Speed"
#define FIELD_4 "Ident"
#define FIELD_NAMES "Temp,Height,Speed,Ident"
main( )
{
struct {
float32 temp;
int16 height;
float32 speed;
char ident;
} source[NRECORDS];
int32 file_id, vdata_id, istat, msize = 0;
uint8 *databuf, *pntr;
int i, bufsize, recsize;
VOIDP fldbufpt[4];
/* Open the HDF file. */
file_id = Hopen("VD_Ex4.hdf", DFACC_CREATE, 0);
/* Initialize the Vset interface. */
istat =Vstart(file_id);
/* Create a new Vdata. */
vdata_id = VSattach(file_id, -1, "w");
/* Define the field to write. */
istat = VSfdefine(vdata_id, FIELD_1, DFNT_FLOAT32, 1);
istat = VSfdefine(vdata_id, FIELD_2, DFNT_INT16, 1);
istat = VSfdefine(vdata_id, FIELD_3, DFNT_FLOAT32, 1);
istat = VSfdefine(vdata_id, FIELD_4, DFNT_CHAR8, 1);
/* Set the Vdata name. */
istat=VSsetname(vdata_id, "Example Vset Name");
/* Set the Vdata class. */
istat=VSsetclass(vdata_id, "Example Vset Class");
/* Set the field names. */
istat = VSsetfields(vdata_id, FIELD_NAMES);
recsize = (2 * sizeof(float32) + sizeof(int16)
+ sizeof(char));
bufsize = recsize * NRECORDS;
databuf = (uint8 *) malloc(bufsize);
if (databuf == NULL) {
printf("malloc failed\n");
exit;
}
pntr = databuf;
/* set record values */
for (i = 0; i < NRECORDS; i++) {
source[i].temp = 1.11 * (i+1);
source[i].height = i;
source[i].speed = 1.11 * (i+1);
source[i].ident = 'A' + i;
}
/* pack one record at a time */
for (i = 0; i < NRECORDS; i++) {
/* set field buf address */
fldbufpt[0] = &source[i].temp;
fldbufpt[1] = &source[i].height;
fldbufpt[2] = &source[i].speed;
fldbufpt[3] = &source[i].ident;
/* pack field data into databuf */
istat = VSfpack(vdata_id,_HDF_VSPACK,NULL,(VOIDP)pntr,
recsize, 1, NULL, fldbufpt);
if (istat == FAIL) {
printf("VSfpack failed in packing record %d\n", i);
}
pntr = pntr + recsize;
}
/* Write the data to the Vset object. */
istat = VSwrite(vdata_id, databuf, NRECORDS, FULL_INTERLACE);
/*
* Terminate access to the Vdata, the Vset interface
* and the HDF file.
*/
istat = VSdetach(vdata_id);
istat = Vend(file_id);
istat = Hclose(file_id);
free(databuf);
}