[vox-tech] loop never exits!

Jeff Newmiller jdnewmil at dcn.davis.ca.us
Wed Apr 21 15:26:04 PDT 2010


On Wed, 21 Apr 2010, Matthew Van Gundy wrote:

> On 4/21/10 1:05 PM, Brian Lavender wrote:
>> Well, it seems to me that to reverse a array in C, you are going to have
>> to use a counter and decrement it. And, since C uses zero indexed
>> arrays, it certainly seems to leave me in a quandry whether to use
>> signed or unsigned. We know that an array index should always be zero or
>> greater. Yet, if we use a simple for loop, one has to test for an exit
>> condition. So, what's the solution??? Is it just make the index value
>> "i" signed?
>
> There are many ways to skin a cat, here's one:
>
> void reverse(int forward[], int backward[], unsigned int n) {
>   unsigned i = n;
>   while(i-- > 0) {
>     backward[n-i-1] = forward[i];
>   }
> }

This reverses and then re-reverses it.

Two comments:

a) I believe Standard C calls for the use of "int" as the index of arrays, 
and leaves it to the compiler to determine whether that should be "signed 
int" or "unsigned int".  I am not familiar with any compilers that use 
"unsigned int" when "int" is specified (and I suspect it would break a lot 
of code).

This means that when you use an unsigned int there is a conversion to int 
before the index is used. If the value of your unsigned int is greater 
than MAX_INT, then your results are undefined according to Standard C, so 
you should go with the flow and use "int" for indexing arrays.

b) In C, conventional indexed for loops do not stop until the index has 
exited the range of index values that you intend to use in the loop. That 
means there has to be at least one valid index value that falls outside 
your range of interest (as you have discovered for this specific type of 
index counter). If you wish to construct a loop that does not exhibit this 
behavior, you can use a do{}while() loop that ends on the last value used.

---------------------------------------------------------------------------
Jeff Newmiller                        The     .....       .....  Go Live...
DCN:<jdnewmil at dcn.davis.ca.us>        Basics: ##.#.       ##.#.  Live Go...
                                       Live:   OO#.. Dead: OO#..  Playing
Research Engineer (Solar/Batteries            O.O#.       #.O#.  with
/Software/Embedded Controllers)               .OO#.       .OO#.  rocks...2k
---------------------------------------------------------------------------


More information about the vox-tech mailing list