On Wed, 2010-04-21 at 19:20 -0700, Matthew Van Gundy wrote: > On 4/21/10 3:26 PM, Jeff Newmiller wrote: > >> 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. > > Nope, just reverses it once. I'll admit, it isn't an idiomatic > construction, but it uses an unsigned index that counts down to reverse > an array since that's what Brian seemed to be after.
The most idiomatic construction in C for writing an iterator is to use pointer arithmetic. i.e. int* thearray; size_t itssize; for(int* iterator=thearray; iterator<thearray+itssize;++iterator){ /* do something with the iterator */ } The loop terminates when the address of iterator is one past the end of the array. The C standard guarantees that you can *form* the address one past the end of the array (i.e. on a 32-bit machine with 4GB of address space, the last element of the array can't abut the end of RAM, or some compiler-level hack is required to guarantee that you can form the address). However, the C standard makes no guarantees about being able to form the address *before* the array, so the following is not guaranteed to work: for(int* iterator=thearray+itssize-1; iterator>=thearray;--iterator){ /* do something with the iterator */ } The following idiom must be used instead: int* iterator=thearray+itssize; while( iterator-- > thearray){ /* do something with the iterator. */ } The asymmetry you're noticing with unsigned int indices is a similar problem. _______________________________________________ vox-tech mailing list vox-tech@lists.lugod.org http://lists.lugod.org/mailman/listinfo/vox-tech