Hi Pierre,

The code should work (it works for me) after fixing 2 problems.

1.)  hsize_t  counts[3]={1,1,1}; in line 12 should be hsize_t  
counts[3]={1,1,3};

 The hyperslab that you want to write is the 3 elements at y,x,0 - y,x,2, so 
you start at y,x,0, write 1x1x1 blocks for a count of 3 in the third dimension 
while not changing the first 2 dimensions.

2.)  Your code selects a hyperslab in "dataspace" in line 15, which will be the 
correct hyperslab after making correction #1.  But then it gets a new space 
"filespace" which is used for the call to HDwrite().  While the "filespace" id 
identifies the same dataspace as "dataspace", no hyperslab has been selected 
for it, hence the error "src and dest data spaces have different sizes".  You 
should eliminate "filespace" entirely and in its place in the call to H5Dwrite 
use the "dataspace" that you have passed in and used to select the hyperslab.

While the program will then work, the memory dataspace could also be simplified 
since 2 of the dimensions are 1:
    change line 13 to     hsize_t  dims_memory[1]={3};
          and line 18 to     hid_t  memspace  = H5Screate_simple(1, 
dims_memory, NULL);

For reference, there are example programs that read and write hyperslabs in 
hdf5 at these links: 
http://www.hdfgroup.org/HDF5/Tutor/select.html
http://www.hdfgroup.org/HDF5/Tutor/phype.html
http://www.hdfgroup.org/ftp/HDF5/examples/misc-examples/#dspc

Hope this helps,
Larry

________________________________________
From: Hdf-forum <[email protected]> on behalf of Pierre 
Lindenbaum <[email protected]>
Sent: Tuesday, July 22, 2014 7:09 AM
To: [email protected]
Subject: [Hdf-forum] newbie:  updating a cell in a table of integers

(cross posted http://stackoverflow.com/questions/24883461 )

Hi all,

I'm a newbie with HDF5.

I built a *5x4* table.

Each cell of the table contains *3* integers

I'm trying to write a function `setyx` that would update a cell of the
table at y,x


I wrote the C code below but it raises some errors:

|   #000: H5Dio.c line 225 in H5Dwrite(): can't prepare for writing data
     major:  Dataset
     minor:  Write  failed
   #001: H5Dio.c line 347 in H5D__pre_write(): can't write data
     major:  Dataset
     minor:  Write  failed
   #002: H5Dio.c line 685 in H5D__write(): src and dest data spaces have 
different sizes
     major:  Invalid  arguments to routine
     minor:  Bad  value|

what is the correct way to update a given cell at |(y,x)| ?


/*
-------------------------------------------------------------------------------------------------------------*/
include "hdf5.h"

/** set 3 'int' values at y/x */
static void setyx(hid_t dataset, hid_t dataspace,
                   int y,int x,
                   int i1,int i2,int i3)
     {
     int values[3]={i1,i2,i3};
     hsize_t  starts[3]={y,x,0};
     hsize_t  counts[3]={1,1,1};
     hsize_t  dims_memory[3]={1,1,3};

     H5Sselect_hyperslab(dataspace, H5S_SELECT_SET, starts, NULL,
counts, NULL);
     hid_t filespace = H5Dget_space(dataset);
     hid_t  memspace  = H5Screate_simple(3, dims_memory, NULL);

     H5Dwrite(dataset,
         H5T_NATIVE_INT,
         memspace,
         filespace,
         H5P_DEFAULT,
         values);

      H5Sclose(memspace);
      H5Sclose(filespace);
     }


int main (void)
      {
      hid_t       file, dataset;
      hid_t       dataspace;
      hsize_t     dims[3]={5,4,3};


      file = H5Fcreate("test.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
      dataspace = H5Screate_simple(3, dims, NULL);
      dataset = H5Dcreate(file, "/test", H5T_NATIVE_INT, dataspace,
                         H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
      setyx(dataset,dataspace,2,1, 100,200,300);

      H5Sclose(dataspace);
      H5Dclose(dataset);
      H5Fclose(file);
      return 0;
     }
/*
-------------------------------------------------------------------------------------------------------------*/

_______________________________________________
Hdf-forum is for HDF software users discussion.
[email protected]
http://mail.lists.hdfgroup.org/mailman/listinfo/hdf-forum_lists.hdfgroup.org
Twitter: https://twitter.com/hdf5

_______________________________________________
Hdf-forum is for HDF software users discussion.
[email protected]
http://mail.lists.hdfgroup.org/mailman/listinfo/hdf-forum_lists.hdfgroup.org
Twitter: https://twitter.com/hdf5

Reply via email to