print_ary (ary, DIM (ary));
void print_ary (int *aryp, int n)
{
goto skip_comma;
for (;n;aryp++, n--)
{
printf (", ");
skip_comma:
printf ("%u", *aryp);
}
printf ("\n");
}
> I'd skip both the GOTO and the conditional
and do it:
>
> void print_ary(int *aryp,size_t n)
> {
> size_t i;
> char *sep;
>
> assert(aryp != NULL); /* sorry, gotta check */
> assert(n > 0);
>
> for (i = 0 , sep = "" ; i < n ; aryp++ , i++)
> {
> printf("%s%u",sep,&aryp);
> sep = ",";
> }
> putchar('\n');
> }
Clever. I don't like the conditional either, but
you are also
unnecessarily reinitializing sep every time through the loop. With the
goto I avoid both the conditional and the reinit.
Given that the original example assumes n > 0 (the test is skipped on
first entry to the loop), you can accomplish this function with neither
an extra conditional, superfluous assignment, extra variables or use
of 'goto'
void print_arg(int *aryp, unsigned n)
{
int i;
for(i=0; ;) {
printf("%u", aryp[i]);
if(++i >= n)
break;
fputs(", ", stdout); }
putc('\n', stdout);
}
--
dave04a (at) Dave Dunfield
dunfield (dot) Firmware development services & tools:
www.dunfield.com
com Collector of vintage computing equipment:
http://www.parse.com/~ddunfield/museum/index.html