[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