
Hi, I would greatly appreciate your help with this, as I have spent considerable time and have run out of ideas: In the following piece of code, I want to recursively visit the elements of a 4-dimensional array. If all the dimensions are the same, there is no problem. However, if there is a dimension of different length the program crashes ! TIA, Petros ps: This is only a toy problem for the purpose of showing the issue. [ using boost 1.49, with msvc 2010, on win 7 ]. Please, toggle the comment in the line : shape[1] = 3; to see the problem. The program : int test_ma_iterationDIM(){ const size_t DIM = 4 ; typedef multi_array< int, DIM > IntMADIM; typedef IntMADIM::index index; array<size_t, DIM> shape; fill( shape.begin(), shape.end(), 2 ) ; // shape[1] = 3; IntMADIM a( shape, boost::fortran_storage_order() ); // Setting a[ijkl] = 1000*L + 100*K +10*J +I : for ( size_t i=0; i!= shape[0]; ++i ) for ( size_t j=0; j!= shape[1]; ++j ) for ( size_t k=0; k!= shape[2]; ++k ) for ( size_t l=0; l!= shape[3]; ++l ) a[i][j][k][l] = (i+1) + (j+1) * 10 + (k + 1) * 100 + (l+1)*1000; typedef IntMADIM::index_range range; int * data = a.data(); array< index, DIM > lowerBounds, upperBounds; for ( size_t i = 0; i != DIM; ++i ){ lowerBounds[i] = 0; upperBounds[i] = shape[i] ; } typedef IntMADIM::const_iterator iterator3; typedef iterator3::value_type::const_iterator iterator2; typedef iterator2::value_type::const_iterator iterator1; typedef iterator1::value_type::const_iterator iterator0; iterator3 begin3 = a.begin() + lowerBounds[3], end3 = a.begin() + upperBounds[3]; for ( iterator3 i3 = begin3; i3 != end3; ++i3 ){ iterator2 begin2 = i3->begin() + lowerBounds[2], end2 = i3->begin() + upperBounds[2]; for ( iterator2 i2 = begin2; i2 != end2; ++i2 ){ iterator1 begin1 = i2->begin() + lowerBounds[1], end1 = i2->begin() + upperBounds[1]; for ( iterator1 i1 = begin1; i1 != end1; ++i1 ){ iterator0 begin0 = i1->begin() + lowerBounds[0], end0 = i1->begin() + upperBounds[0]; for ( iterator0 i0 = begin0; i0 != end0; ++i0 ){ cout << *i0 << endl; } } } } return 1; }

Hi Petros, On Jun 18, 2012, at 7:54 PM, Petros wrote:
Hi, I would greatly appreciate your help with this, as I have spent considerable time and have run out of ideas: In the following piece of code, I want to recursively visit the elements of a 4-dimensional array. If all the dimensions are the same, there is no problem. However, if there is a dimension of different length the program crashes ! TIA, Petros
...
The program :
...
iterator3 begin3 = a.begin() + lowerBounds[3], end3 = a.begin() + upperBounds[3]; for ( iterator3 i3 = begin3; i3 != end3; ++i3 ){
iterator2 begin2 = i3->begin() + lowerBounds[2], end2 = i3->begin() + upperBounds[2]; for ( iterator2 i2 = begin2; i2 != end2; ++i2 ){ iterator1 begin1 = i2->begin() + lowerBounds[1], end1 = i2->begin() + upperBounds[1]; for ( iterator1 i1 = begin1; i1 != end1; ++i1 ){
iterator0 begin0 = i1->begin() + lowerBounds[0], end0 = i1->begin() + upperBounds[0]; for ( iterator0 i0 = begin0; i0 != end0; ++i0 ){
cout << *i0 << endl; } } } }
It looks like you are indexing lowerBounds and upperBounds in the wrong order (3,2,1,0 instead of 0,1,2,3). HTH, Ron

Hi Ron, Thank you very much. All the best, Petros From: Ronald Garcia Sent: Tuesday, June 19, 2012 10:52 AM To: boost-users@lists.boost.org Subject: Re: [Boost-users] multi_array iteration problem Hi Petros, On Jun 18, 2012, at 7:54 PM, Petros wrote: Hi, I would greatly appreciate your help with this, as I have spent considerable time and have run out of ideas: In the following piece of code, I want to recursively visit the elements of a 4-dimensional array. If all the dimensions are the same, there is no problem. However, if there is a dimension of different length the program crashes ! TIA, Petros ... The program : ... iterator3 begin3 = a.begin() + lowerBounds[3], end3 = a.begin() + upperBounds[3]; for ( iterator3 i3 = begin3; i3 != end3; ++i3 ){ iterator2 begin2 = i3->begin() + lowerBounds[2], end2 = i3->begin() + upperBounds[2]; for ( iterator2 i2 = begin2; i2 != end2; ++i2 ){ iterator1 begin1 = i2->begin() + lowerBounds[1], end1 = i2->begin() + upperBounds[1]; for ( iterator1 i1 = begin1; i1 != end1; ++i1 ){ iterator0 begin0 = i1->begin() + lowerBounds[0], end0 = i1->begin() + upperBounds[0]; for ( iterator0 i0 = begin0; i0 != end0; ++i0 ){ cout << *i0 << endl; } } } } It looks like you are indexing lowerBounds and upperBounds in the wrong order (3,2,1,0 instead of 0,1,2,3). HTH, Ron -------------------------------------------------------------------------------- _______________________________________________ Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users
participants (2)
-
Petros
-
Ronald Garcia