summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorQuincey Koziol <koziol@hdfgroup.org>2002-04-30 14:40:54 (GMT)
committerQuincey Koziol <koziol@hdfgroup.org>2002-04-30 14:40:54 (GMT)
commitcf77a714b949cc798a3f0701d5861b86e0499e12 (patch)
tree0678fa24d7bbaaf148b449d4857739b878a42898
parentdf8830ed1a2750861bad8c81242fc62e2a17b53e (diff)
downloadhdf5-cf77a714b949cc798a3f0701d5861b86e0499e12.zip
hdf5-cf77a714b949cc798a3f0701d5861b86e0499e12.tar.gz
hdf5-cf77a714b949cc798a3f0701d5861b86e0499e12.tar.bz2
[svn-r5287] Purpose:
Bug Fix Description: Coordinate offsets were not being calculated correctly for irregular hyperslabs when being iterated through. Solution: Correct coordinate calculation. Platforms tested: FreeBSD 4.5 (sleipnir)
-rw-r--r--src/H5Shyper.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/src/H5Shyper.c b/src/H5Shyper.c
index a2eaf51..bfe53a3 100644
--- a/src/H5Shyper.c
+++ b/src/H5Shyper.c
@@ -54,7 +54,6 @@ typedef struct {
H5S_sel_iter_t *iter;
void *src;
hsize_t mem_size[H5O_LAYOUT_NDIMS];
- hssize_t mem_offset[H5O_LAYOUT_NDIMS];
H5D_operator_t op;
void * op_data;
} H5S_hyper_iter_info_t;
@@ -5121,6 +5120,7 @@ H5S_hyper_select_iterate_mem (int dim, H5S_hyper_iter_info_t *iter_info)
hsize_t offset; /* offset of region in buffer */
void *tmp_buf; /* temporary location of the element in the buffer */
H5S_hyper_region_t *regions; /* Pointer to array of hyperslab nodes overlapped */
+ hssize_t mem_offset[H5O_LAYOUT_NDIMS]; /* Offset array */
size_t num_regions; /* number of regions overlapped */
herr_t user_ret=0; /* User's return value */
size_t i; /* Counters */
@@ -5142,28 +5142,29 @@ H5S_hyper_select_iterate_mem (int dim, H5S_hyper_iter_info_t *iter_info)
/* (Which means that we've got a list of the regions in the fastest */
/* changing dimension and should input those regions) */
if((unsigned)(dim+2)==iter_info->space->extent.u.simple.rank) {
- HDmemcpy(iter_info->mem_offset, iter_info->iter->hyp.pos,(iter_info->space->extent.u.simple.rank*sizeof(hssize_t)));
- iter_info->mem_offset[iter_info->space->extent.u.simple.rank]=0;
+ /* Get the current coordinate position */
+ HDmemcpy(mem_offset, iter_info->iter->hyp.pos,(iter_info->space->extent.u.simple.rank*sizeof(hssize_t)));
+ mem_offset[iter_info->space->extent.u.simple.rank]=0;
/* Iterate over data from regions */
for(i=0; i<num_regions && user_ret==0; i++) {
/* Set the location of the current hyperslab */
- iter_info->mem_offset[iter_info->space->extent.u.simple.rank-1]=regions[i].start;
+ mem_offset[iter_info->space->extent.u.simple.rank-1]=regions[i].start;
/* Get the offset in the memory buffer */
offset=H5V_array_offset(iter_info->space->extent.u.simple.rank+1,
- iter_info->mem_size,iter_info->mem_offset);
+ iter_info->mem_size,mem_offset);
tmp_buf=((char *)iter_info->src+offset);
/* Iterate over each element in the current region */
for(j=regions[i].start; j<=regions[i].end && user_ret==0; j++) {
/* Call the user's function */
- user_ret=(*(iter_info->op))(tmp_buf,iter_info->dt,(hsize_t)iter_info->space->extent.u.simple.rank,iter_info->mem_offset,iter_info->op_data);
+ user_ret=(*(iter_info->op))(tmp_buf,iter_info->dt,(hsize_t)iter_info->space->extent.u.simple.rank,mem_offset,iter_info->op_data);
/* Subtract the element from the selected region (not implemented yet) */
/* Increment the coordinate offset */
- iter_info->mem_offset[iter_info->space->extent.u.simple.rank-1]=j;
+ mem_offset[iter_info->space->extent.u.simple.rank-1]++;
/* Advance the pointer in the buffer */
tmp_buf=((char *)tmp_buf+iter_info->elem_size);