It is possible to represent N-dimensional space as 1-dim, with one index, from which you can calculate N sub-indexes if you need them.
Below I'm attaching example implementation of this kind of space flattening
#include <stdio.h>
int bonds[][2] = {
{1, 2},
{5, 10},
{0, 3},
{6, 8}
};
int get_index(int index_position, int current, int sizes[], int sizes_size) {
int mod = 1;
for(int i = index_position; i < sizes_size; i++) {
mod *= sizes[i];
}
int div = mod / sizes[index_position];
return (current % mod) / div;
}
int main(int argc, char** argv) {
int sizes[] = {
bonds[0][1] - bonds[0][0],
bonds[1][1] - bonds[1][0],
bonds[2][1] - bonds[2][0],
bonds[3][1] - bonds[3][0]
};
int big_size = sizes[0] * sizes[1] * sizes[2] * sizes[3];
for(int i = 0; i < big_size; i++) {
/* get indexes */
/*
int i0 = ((i % (sizes[0] * sizes[1] * sizes[2] * sizes[3])) / (sizes[1] * sizes[2] * sizes[3])) + bonds[0][0];
int i1 = ((i % ( sizes[1] * sizes[2] * sizes[3])) / ( sizes[2] * sizes[3])) + bonds[1][0];
int i2 = ((i % ( sizes[2] * sizes[3])) / ( sizes[3])) + bonds[2][0];
int i3 = ((i % ( sizes[3])) ) + bonds[3][0];
*/
int i0 = get_index(0, i, sizes, 4) + bonds[0][0];
int i1 = get_index(1, i, sizes, 4) + bonds[1][0];
int i2 = get_index(2, i, sizes, 4) + bonds[2][0];
int i3 = get_index(3, i, sizes, 4) + bonds[3][0];
printf("%d %d %d %d\n", i0, i1, i2, i3);
}
return 0;
}
Dynamic handling of bonds/sizes array is out scope here. The example shows how to calculate sub-indexes from flattened space.