martin@mwtech.UUCP (Martin Weitzel) (04/12/90)
In article <1990Apr11.001355.25937@athena.mit.edu> scs@adam.mit.edu (Steve Summit) writes: >In article <4878@helios.TAMU.EDU> john@stat.tamu.edu (John S. Price) writes: >>srand(time(NULL)); > >Make that > > #include <sys/types.h> > srand((int)time((time_t)NULL)); Hmm, if I grep thru my /usr/lib/llib-lc (on a 386/ix) I find long time(t) long *t; { return (0L);} and grepping thru /usr/include/sys/types.h shows me typedef long time_t; /* <time> type */ Now, could it be you really wanted to write --+ | v-------------+ srand((int)time((time_t *)NULL)); >This is not mere pedantry; it does make a difference. I'm >posting this reminder only because this code matches the one time >I ever got burned by a realio, trulio int/pointer mismatch, and >in case there is anyone out there who still isn't convinced that >proper pointer casts are in fact necessary in function call True, but what you in effect did was casting the NULL to a long !?! >arguments. Somehow I forgot the cast one day and typed >srand(time(NULL)) into the planet's lowest quality/popularity Strange, normally, NULL should match any pointer type (including long* and time_t*) but ... maybe it was implemented not quite clean (eg `#define NULL (0)' - what is sufficient for assigning and comparing) ... or may it be that you mixed memory modells? BTW: In my programms I have a strong tendency *not* to use NULL at all. The reason is that in my opinion there is not *one* single NULL-pointer in C, but as many (T*)0-pointers, as there are types T. In other words: I compare the result of `fopen' to `(FILE*)0', the result `fgets' to `(char*)0' and if I construct a binary tree with nodes of type `struct tnode' I usually write a `#define NULLNODE ((struct tnode *)0)'. [some lines deleted] >Watch those NULL pointers, folks. (Yes; prototypes might have >helped.) ... and so should `lint'. -- Martin Weitzel, email: martin@mwtech.UUCP, voice: 49-(0)6151-6 56 83