Pointing pointers at varying types of objects.(solution)

David M. LaRocque larocque at jupiter.crd.ge.com
Thu May 3 08:00:08 AEST 1990


In article <7301 at crdgw1.crd.ge.com>, larocque at jupiter.crd.ge.com (David M. LaRocque) writes:
> 
> I am currently involved in translating a large Lisp 
> program into C.  Much of the code has already been 
> translated by another person and something they did
> has me concerned.  Since in Lisp variables are not
> typed, any variable can have any Lisp object as its
> value.  To deal with this problem my predecessor
> wrote code that would perform operations on "generic"
> data.

I posted this message earlier today and have gotten the
solution I had hoped for.  Many thanks to Chris Torek
(chris at cs.umd.edu) and for his solution which I am
including (without his permission, but I don't think
he'll mind).

****** Chris' solution start **********************

If you limit yourself to data pointers, you can use `char *' (old C)
or `void *' (ANSI C) as a `generic' pointer type.  The resulting pointers
will always point to `char's or to mystery-objects and must always be
cast to something else before you can use them; this will convert word
pointers or typed pointers on machines that have such.  For instance:

	struct tree {
		struct tree *left;
		struct tree *right;
		void *object;
	};

	void *search(struct tree *top, void *obj, int (*compar)()) {
		int x;
		while (top != NULL) {
			x = (*compar)(top->object, obj);
			if (x == 0)	/* we found it */
				return top->object;
			if (x < 0)	/* top->object < obj: move right */
				top = top->right;
			else		/* top->object > obj: move left */
				top = top->left;
		}
		return NULL;	/* obj not in tree */
	}

then:

	struct myobj {
		int mainval;
		int subval;
		char comment[24];
	};

	int mycompare(void *a1, void *a2) {
		struct myobj *o1 = a1, *o2 = a2;
		if (o1->mainval < o2->mainval)
			return -1;
		if (o1->mainval > o2->mainval)
			return 1;
		if (o1->subval < o2->subval)
			return -1;
		if (o1->subvaxl > o2->subval)
			return 1;
		return 0;	/* equal */
	}
	...
		struct myobj *p;
		if ((p = search(objtree, (void *)&temp, mycompare)) == NULL)
			... not in tree ...
		else
			printf("%.*s\n", sizeof(p->comment), p->comment);

This is not quite as convenient as in Lisp.

Chris

************* End Chris' solution ****************

 
/**************************************************
 * larocque at crd.ge.com        (518) 387-5805
 * ...!crdgw1!cetus.crd.ge.com!larocque
 **************************************************/



More information about the Comp.lang.c mailing list