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