Re: why does this give me a segmetation fault?

Hi Ed,

> Do me a favor, compile and run this program.
    Sure, I'll let you know in a few minutes what my prognosis is... :-)

        Quincey

> When I chage this program to use a contiguous dataset, and take out
> the H5Dextend call, everything works. But using an extendable dataset,
> it give me a seg fault.
> 
> Obviously I'm doing something wrong with respect to my setting up or
> using the chunked dataset. I'm going to reread the docs and see what
> they say again...
> 
> Ed
> 
> 
> /* 
>    Why doesn't this work?
> */
> 
> #include <hdf5.h>
> 
> int main(void);
> 
> #define BAIL(e) do { \
> printf("Bailing out in file %s, line %d, error:%d.\n", __FILE__, __LINE__, 
> e); \
> goto exit; \
> } while (0) 
> 
> #define DATASET_NAME "eds_ds"
> 
> int
> main()
> {
>    hid_t hdfid = 0, datasetid = 0, plistid = 0, type = 0;
>    hid_t mem_space = 0, file_space = 0;
>    float data = 99.9;
>    hssize_t ndata;
>    hssize_t coord[1][1];
>    int retval = 0;
> 
>    /* Create a file. */
>    if ((hdfid = H5Fcreate("aaa_test.h5", H5F_ACC_TRUNC, H5P_DEFAULT, 
> H5P_DEFAULT)) < 0)
>       BAIL(-1);
> 
>    /* Store floats. */
>    if ((type = H5Tcopy(H5T_NATIVE_FLOAT)) < 0)
>       BAIL(-2);
>    
>    /* Reading and writing to memory always happens one element at a
>       time. */
>    {
>       hsize_t dimsize1[] = {1};
>       if ((mem_space = H5Screate_simple(1, dimsize1, NULL)) < 0) 
>        BAIL(-3);
>    }
>    
>    /* Crate an extendable dataset, of rank 1, with 1 datum in it. */
>    {
>       hsize_t maxdim = H5S_UNLIMITED, start_ndata = 1, chunk_size = 1;
>       if ((file_space = H5Screate_simple(1, &start_ndata, &maxdim)) < 0) 
>        BAIL(-4);
>       if ((plistid = H5Pcreate(H5P_DATASET_CREATE)) < 0)
>        BAIL(-4);
>       if (H5Pset_chunk(plistid, 1,  &chunk_size) < 0)
>        BAIL(-4);
>       if ((datasetid = H5Dcreate(hdfid, DATASET_NAME, 
>                                type, file_space, plistid)) < 0)
>        BAIL(-4);
>    }
> 
>    /* Write one value. */
>    if ((file_space = H5Dget_space(datasetid)) < 0)
>       BAIL(-4);
>    ndata = H5Sget_simple_extent_npoints(file_space);
>    printf("number of data in dataset: %d\n", (int)ndata);
>    coord[0][0] = 0;
>    if (H5Sselect_elements(file_space, H5S_SELECT_SET, 1, 
>                         (const hssize_t **)coord) < 0)
>       BAIL(-4);
>    if (H5Dwrite(datasetid, type, mem_space, file_space, 
>               H5P_DEFAULT, &data) < 0)
>       BAIL(-4);
>    H5Dclose(datasetid);
>    datasetid = 0;
> 
>    /* Read the value just written. */
>    {
>       float thefloat;
> 
>       if ((datasetid = H5Dopen(hdfid, DATASET_NAME)) < 0)
>        BAIL(-3);
>       if ((file_space = H5Dget_space(datasetid)) < 0)
>        BAIL(-3);
>       ndata = H5Sget_simple_extent_npoints(file_space);
>       printf("number of data in dataset: %d\n", (int)ndata);
>       coord[0][0] = 0;
>       if (H5Sselect_elements(file_space, H5S_SELECT_SET, 1, 
>                            (const hssize_t **)coord) < 0)
>        BAIL(-4);
>       if (H5Dread(datasetid, type, mem_space, file_space, 
>                 H5P_DEFAULT, &thefloat) < 0)
>        BAIL(-3);
>       printf("the float: %f\n", thefloat);
>       H5Dclose(datasetid);
>       datasetid = 0;
>    }
> 
>    /* Add another datum. */
>    {
>       hsize_t extend_size = 2;
>       float secfloat = 88.8;
>       if ((datasetid = H5Dopen(hdfid, DATASET_NAME)) < 0)
>        BAIL(-3);
>       if (H5Dextend(datasetid, &extend_size) < 0)
>        BAIL(-10);
>       if ((file_space = H5Dget_space(datasetid)) < 0)
>        BAIL(-4);
>       ndata = H5Sget_simple_extent_npoints(file_space);
>       printf("number of data in dataset: %d\n", (int)ndata);
>       coord[0][0] = 1;
>       if (H5Sselect_elements(file_space, H5S_SELECT_SET, 1, 
>                            (const hssize_t **)coord) < 0)
>        BAIL(-4);
>       if (H5Dwrite(datasetid, type, mem_space, file_space, 
>                  H5P_DEFAULT, &secfloat) < 0)
>        BAIL(-4);
>       H5Dclose(datasetid);
>       datasetid = 0;
>    }
> 
>    /* Read the value just written. */
>    {
>       float thefloat;
> 
>       if ((datasetid = H5Dopen(hdfid, DATASET_NAME)) < 0)
>        BAIL(-3);
>       if ((file_space = H5Dget_space(datasetid)) < 0)
>        BAIL(-3);
>       ndata = H5Sget_simple_extent_npoints(file_space);
>       printf("number of data in dataset: %d\n", (int)ndata);
>       coord[0][0] = 1;
>       if (H5Sselect_elements(file_space, H5S_SELECT_SET, 1, 
>                            (const hssize_t **)coord) < 0)
>        BAIL(-4);
>       if (H5Dread(datasetid, type, mem_space, file_space, 
>                 H5P_DEFAULT, &thefloat) < 0)
>        BAIL(-3);
>       printf("the float: %f\n", thefloat);
>       H5Dclose(datasetid);
>       datasetid = 0;
>    }
> 
>  exit:
>    if (datasetid > 0) H5Dclose(datasetid);
>    if (type > 0) H5Tclose(type);
>    if (mem_space > 0) H5Sclose(mem_space);
>    if (file_space > 0) H5Sclose(file_space);
>    if (plistid > 0) H5Pclose(plistid);
>    return retval;
> }
>