From ... From: Erik Naggum Subject: Re: What is wrong with OO ? Date: 1997/02/13 Message-ID: <3064828794077287@naggum.no>#1/1 X-Deja-AN: 218500965 References: <5dr62h$i6o@Masala.CC.UH.EDU> mail-copies-to: never Organization: Naggum Software; +47 2295 0313; http://www.naggum.no Newsgroups: comp.lang.c++,comp.lang.lisp * cosc19z5@Bayou.UH.EDU | In C however, you need pointers for tasks which do not require them -- | modifying arguments to functions! the very existence of a "better" mechanism to do this in C++ (references) suggest that multiple return values really do make a lot of sense, despite all the hostile arguments from certain camps when you suggest this. that a widely used tool like `perl' also supports them as a matter of course, and to its users delight, is perhaps indicative of a fundamental flaw in the argument that functions in programming languages should only return one value, as opposed to functions in mathematics, which already differ greatly from "our" functions. incidentally, I happen to dislike the approaches to faking the return of multiple values that don't actually return multiple values: structs in C, lists in Scheme, OUT arguments in Ada, NAME in Simula, VAR in Pascal, references (mere syntactic sugar for pointers) in C++, etc. my favorite example is getting the current time under Unix and in C: `gettimeofday' takes two pointers to structures you have to declare and possibly allocate memory for, fills them in for you, and then you get to retriev the values from them. the function returns four integers in this very complicated way: seconds since the epoch, microseconds into the current second, time zone as the number of minutes west of Greenwich, and the type of daylight savings time to apply. let's also not forget that `gettimeofday' includes an error return value to indicate only one kind of error: "an argument address referenced invalid memory", or a stray pointer. to decode this time into your current timezone, you need to decode it with the function `localtime', which, unsurprisingly, takes a pointer to the first return value from `gettimeofday' and returns a pointer to statically allocated memory that contains the values you need in a structure. you need to make certain that you copy all of these values to your own space before some other function clobbers it. `localtime' returns 11 values, most of which you don't need. (and then, of course, the day of the month is a number in the range 1-31, but the month is a number in the range 0-11 and the year is 1900 less than the actual year, but that's another can of worms.) all this to achieve the effect of multiple return values! to summarize: `gettimeofday' requires pointers to preallocated memory to return multiple values, and has an error return value to barf on the address of that memory, while `localtime' returns a pointer to a static memory area overwritten by each call. this epitomizes the Unix interface as I see it -- Unix doesn't give its programmers the time of day. #\Erik -- my other car is a cdr