Return to BSD News archive
Xref: sserve comp.os.386bsd.questions:13912 comp.os.386bsd.misc:3769 Path: sserve!newshost.anu.edu.au!harbinger.cc.monash.edu.au!news.cs.su.oz.au!news.adelaide.edu.au!gateway.dircsa.org.au!cleese.apana.org.au!apanix.apana.org.au!hart From: hart@apanix.apana.org.au (Leigh Hart) Newsgroups: comp.os.386bsd.questions,comp.os.386bsd.misc Subject: Re: How UTTERLY Amazing! (Was Re: FreeBSD vs NetBSD) Date: 20 Oct 94 02:11:24 GMT Organization: Apanix Public Access Unix, +61 8 373 5485 (5 lines) Lines: 101 Message-ID: <hart.782619084@apanix.apana.org.au> References: <37fvk8$9mm@rivendell.apana.org.au> <37p5f2$kjl@cleese.apana.org.au> <hart.782272416@apanix.apana.org.au> <37ubqf$3ae@news.panix.com> NNTP-Posting-Host: seldon.apanix.apana.org.au berke@panix.com (Wayne Berke) writes: >hart@apanix.apana.org.au (Leigh Hart) writes: >>So in reality, flame expects a pointer to struct twit, whereas phil only >>passed the struct itself. Lets rewrite that code for the pedants (mark): >>while(&jesus) flame(&jesus); >Oh no! Correct me if I'm wrong, but this seems like an infinite loop! >Hopefully, the flame() function a judicious call to exit(). Hmmm, yes it does seem to go on and on a bit doesn't it - but if flame() called exit() (judiciously or otherwise) it wouldn't be a very well behaved function, now would it? Think back to those long lectures where we were all taught good ADT programming! The best we could hope for is to re-write the flame() implementation, to accept struct twit ** instead, that way we could make jesus a pointer to struct twit, and then pass &jesus. Then we could set the pointer to NULL inside flame() to achieve the same (desirable!) result. eg: #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> struct twit { char name[80]; }; unsigned char i=0; void flame(struct twit **); void perror(char *); int printf(char *,...); void flame(struct twit **t) { printf("Flaming %s\n",(*t)->name); sleep(1); i++; if(i==5) (*t)=NULL; } void main() { struct twit *JMJr; if((JMJr=(struct twit *)malloc(sizeof(struct twit)))==NULL) { perror("Yay! malloc() of JMJr failed"); exit(0); } strcpy(JMJr->name,"Jesus Monroy Jr <jmonroy@netcom.com>"); while(JMJr) flame(&JMJr); } Script started on Thu Oct 20 12:10:59 1994 % ./foo Flaming Jesus Monroy Jr <jmonroy@netcom.com> Flaming Jesus Monroy Jr <jmonroy@netcom.com> Flaming Jesus Monroy Jr <jmonroy@netcom.com> Flaming Jesus Monroy Jr <jmonroy@netcom.com> Flaming Jesus Monroy Jr <jmonroy@netcom.com> script done on Thu Oct 20 12:11:08 1994 Hm, that seems to work - however when I mistakenly checked for the wrong thing in the while condition, I got this result: Script started on Thu Oct 20 12:01:12 1994 % ./foo Flaming Jesus Monroy Jr <jmonroy@netcom.com> Flaming Jesus Monroy Jr <jmonroy@netcom.com> Flaming Jesus Monroy Jr <jmonroy@netcom.com> Flaming Jesus Monroy Jr <jmonroy@netcom.com> Flaming Jesus Monroy Jr <jmonroy@netcom.com> Flaming (null) Flaming (null) Flaming (null) Flaming (null) Flaming (null) ^C script done on Thu Oct 20 12:01:23 1994 Hmm, I wonder, perhaps the bug wasn't such a bad thing after all! :-) for the humour impaired. Cheers Leigh -- | "By the time they had diminished | Leigh Hart | | from 50 to 8, the other dwarves | <hart@eppie.apana.org.au> | | began to suspect 'Hungry' ..." | C/- 195 Gilles Street | | -- Gary Larson, "The Far Side" | Adelaide SA 5006 |