From d7303b07518a64fa7c4f5083f19f0da38b1b09e7 Mon Sep 17 00:00:00 2001 From: Ferdi Franceschini Date: Fri, 30 Mar 2007 17:19:18 +1000 Subject: [PATCH] Can now write multidimensional arrays with an unlimited first dimension. r1742 | ffr | 2007-03-30 17:19:18 +1000 (Fri, 30 Mar 2007) | 2 lines --- napi5.c | 52 +++++++++++++++++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 21 deletions(-) diff --git a/napi5.c b/napi5.c index 48089269..4e40f2d4 100644 --- a/napi5.c +++ b/napi5.c @@ -992,7 +992,7 @@ static void ignoreError(void *data, char *text){ int rank; hssize_t myStart[H5S_MAX_RANK]; hsize_t mySize[H5S_MAX_RANK]; - hsize_t size[1],maxdims[H5S_MAX_RANK]; + hsize_t size[H5S_MAX_RANK],maxdims[H5S_MAX_RANK]; hid_t filespace,dataspace; pFile = NXI5assert (fid); @@ -1008,27 +1008,37 @@ static void ignoreError(void *data, char *text){ mySize[i] = iSize[i]; } iRet = H5Sget_simple_extent_dims(pFile->iCurrentS, NULL, maxdims); - dataspace = H5Screate_simple (rank, mySize, NULL); - if (maxdims[0] == NX_UNLIMITED) +//XXX This limits you to one unlimited dimension + if (maxdims[0] == H5S_UNLIMITED) { - size[0]=iStart[0] + iSize[0]; - iRet = H5Dextend(pFile->iCurrentD, size); - filespace = H5Dget_space(pFile->iCurrentD); - - /* define slab */ - iRet = H5Sselect_hyperslab(filespace, H5S_SELECT_SET, myStart, - NULL, mySize, NULL); - /* deal with HDF errors */ - if (iRet < 0) - { - NXIReportError (NXpData, "ERROR: selecting slab failed"); - return NX_ERROR; - } - /* write slab */ - iRet = H5Dwrite(pFile->iCurrentD, pFile->iCurrentT, dataspace, - filespace, H5P_DEFAULT,data); - iRet = H5Sclose(filespace); - } else { + dataspace = H5Screate_simple (rank, mySize, maxdims); + for(i = 0; i < rank; i++) + { + size[i]=iStart[i] + iSize[i]; + } + iRet = H5Dextend(pFile->iCurrentD, size); + filespace = H5Dget_space(pFile->iCurrentD); + + /* define slab */ + iRet = H5Sselect_hyperslab(filespace, H5S_SELECT_SET, myStart, + NULL, mySize, NULL); + /* deal with HDF errors */ + if (iRet < 0) + { + NXIReportError (NXpData, "ERROR: selecting slab failed"); + return NX_ERROR; + } + /* write slab */ + iRet = H5Dwrite(pFile->iCurrentD, pFile->iCurrentT, dataspace, + filespace, H5P_DEFAULT,data); + if (iRet < 0) + { + NXIReportError (NXpData, "ERROR: writing slab failed"); + return NX_ERROR; + } + iRet = H5Sclose(filespace); + } else { + dataspace = H5Screate_simple (rank, mySize, NULL); /* define slab */ iRet = H5Sselect_hyperslab(pFile->iCurrentS, H5S_SELECT_SET, myStart, NULL, mySize, NULL);