goto jumps into loops
der Mouse
mouse at mcgill-vision.UUCP
Mon Apr 21 15:20:26 AEST 1986
In article <69 at brl-smoke.ARPA>, dmh at mit-borax.ARPA (David Harmon) writes:
> [...] I need to print out all the elements of a set capable of containing
> or not containing any value from 0..255.
> [...] but I also wanted to contract adjacent members of a set into a range
> syntax.
>
> /* Assume the existence of a type named "set", which is intended to simulate
> the Pascal TYPE KeySet:SET OF 0..255;
> Further assume the existence of a function
> in(e,l);
> set *l;
> char e;
> which returns a boolean 1 iff _e_ is an element of _*l_.
> */
> [48-line example, using obscure goto, deleted]
I once wrote some code which did something similar; adapting this
to your problem.... As far as I can tell from your code (it's not the
easiest thing in the world to understand), you want spaces instead of
commas. For example, you want
1 3 5-10
not
1,3,5-10
I am also taking the liberty of producing a leading space, that is, this
code produces
" 1 3 5-10"
instead of
"1 3 5-10"
This can be fixed with two more lines (a boolean variable and some code
to use it).
This is only 26 lines (saving of 22), and it is understandable (by
comparison). Five more lines can be trimmed out if you are willing to
sacrifice a smidgen of speed by calling in() more often than is really
necessary:
- delete the declarations of isin and oldin
- delete the initialization of oldin
- delete the oldin=isin assignment
- change these three lines
{ isin = (i==MAX) ? 0 : in(listp,i);
if (isin != oldin)
{ if (isin)
to these two
{ if (((i==MAX)?0:in(listp,i)) != ((i==0)?0:in(listp,i-1)))
{ if ((i==MAX)?0:in(listp,i))
The messy `?:' operators in the last change above (and in the original
assignment to isin) can be eliminated if in() is guaranteed to return 0
for out-of-bounds values of e. Just replace the entire `?:' expression
with the call to in() contained in the `else' part.
Without further ado, here is the code:
#define MAX NUM_KEYWORDS /*The highest element in use by the application*/
wrtlist(listp)
set *listp;
{
int i;
int j;
int isin;
int oldin;
oldin = 0;
for (i=0;i<=MAX;i++)
{ isin = (i==MAX) ? 0 : in(listp,i);
if (isin != oldin)
{ if (isin)
{ printf(" %d",i);
j = i;
}
else
{ if (j < i-1)
{ printf("-%d",i-1);
}
}
}
oldin = isin;
}
}
--
der Mouse
USA: {ihnp4,decvax,akgua,utzoo,etc}!utcsri!mcgill-vision!mouse
philabs!micomvax!musocs!mcgill-vision!mouse
Europe: mcvax!decvax!utcsri!mcgill-vision!mouse
mcvax!seismo!cmcl2!philabs!micomvax!musocs!mcgill-vision!mouse
ARPAnet: utcsri!mcgill-vision!mouse at uw-beaver.arpa
Wizard: One who can find and fix bugs in an emergency
(such as during a site visit by funding agencies).
More information about the Comp.lang.c
mailing list