l i n u x - u s e r s - g r o u p - o f - d a v i s
L U G O D
 
Next Meeting:
July 21: Defensive computing: Information security for individuals
Next Installfest:
TBD
Latest News:
Jul. 4: July, August and September: Security, Photography and Programming for Kids
Page last updated:
2010 Apr 22 09:15

The following is an archive of a post made to our 'vox-tech mailing list' by one of its subscribers.

Report this post as spam:

(Enter your email address)
Re: [vox-tech] loop never exits!
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [vox-tech] loop never exits!



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



LinkedIn
LUGOD Group on LinkedIn
Sign up for LUGOD event announcements
Your email address:
facebook
LUGOD Group on Facebook
'Like' LUGOD on Facebook:

Hosting provided by:
Sunset Systems
Sunset Systems offers preconfigured Linux systems, remote system administration and custom software development.

LUGOD: Linux Users' Group of Davis
PO Box 2082, Davis, CA 95617
Contact Us

LUGOD is a 501(c)7 non-profit organization
based in Davis, California
and serving the Sacramento area.
"Linux" is a trademark of Linus Torvalds.

Sponsored in part by:
O'Reilly and Associates
For numerous book donations.