I have a program that loops through and changes all the elements on an

array n times, so my code looks like this:

for (n=1; n < n_max; ++n)

for(i=imax; i >= 0; --i) {

for(j=0 ; j < jmax; ++j) {

/* main bulk of code goes here */

}

}

The problem is I want to reverse the order of the **two inner loops**,

so I have all 4 possible combinations of the loops incrementing and

decrement i and j. So on the first iteration of n (n=1), i and j will

both incremnt from 0 to their maximum values, but on another they will

decmement from their maximum values to 0. The second permetation would

be:

for(i=imax; i >= 0; --i) {

for(j=0 ; j < jmax; ++j) {

/* loads of code goes here */

}

}

where I have reversed the i loop, and this one where the j loop is

reversed. The other two combinations would be:

for(i=0; i< imax; ++i) {

for(j=jmax ; j >= 0; --j) {

And finally:

for(i=imax; i >= 0; --i) {

for(j=jmax ; j >= 0; --j) {

Can anyone find a ***neat*** way of doing this in a C function?

The only way I have found to do this is at the minute is rather ugly.

I have a C function (which could be main), with four #includes, and

four #defines, which includes a C source file. The exact ordering of

the loops in the included file depends on what is #defined in the main

file. In other words I have:

int main()

{

for(n=1; n < n_max; ++n) {

#define TO_BOTTOM_RIGHT

#include "update_voltage_array.c"

#undef TO_BOTTOM_RIGHT

#define TO_BOTTOM_LEFT

#include "update_voltage_array.c"

#undef TO_BOTTOM_LEFT

#define TO_TOP_RIGHT

#include "update_voltage_array.c"

#undef TO_TOP_RIGHT

#define TO_TOP_LEFT

#include "update_voltage_array.c"

#undef TO_TOP_LEFT

}

then in the file "update_voltage_array.c", I don't have a function,

but bits like this:

#ifdef TO_BOTTOM_RIGHT

for(i= 0; i <= imax; ++i){

for(j=0; j<=jmax; ++j) {

#endif

#ifdef TO_BOTTOM_LEFT

for(i= imax; i >=0 ; --i){

for(j=0; j<=jmax; ++j) {

#endif

#ifdef TO_TOP_RIGHT

for(i= 0; i <= imax; ++i){

for(j=height-1; j>=0; --j) {

#endif

#ifdef TO_TOP_LEFT

for(i= imax; i >=0; --i){

for(j=jmax; j>=0; --j) {

#endif

Can anyone think of a better way of achieving what I want to achieve?

Ideally a function which took a couple of arguments to determine how

the loops behave would be good, but I can't find a way of doing it.

Whilst its easy to pass the start and end points of the loops, I can

find no way of changing the "i < imax" to be an "i >= 0", so passing

those does not help.

Suggestions welcome.

Dr. David Kirkby.

My real email address can be found at:

http://homepage.ntlworld.com/drkirkby/home-email.jpg