Kevin A. Foss wrote:
On Mon, 27 Oct 1997 16:47:56 +0100 (MET), Peter Gerwinski wrote:
On 21 September, Frank Heckenbach posted a Unit `Rand' to this list which implements a `random' and a `randomize' function just this way. You can extract it from the GPC mailing list archives (see http://home.pages.de/~GNU-Pascal/support.html) or download it from ftp://agnes.dida.physik.uni-essen.de/gnu-pascal/contrib/rand.pas.
IMHO, this code is still broken.
True, to some extent. See my previous mail.
On a non-DOS platform it tries to pass an integer to a function expecting a cardinal and always returns a type check error and doesn't compile.
Assigning an integer to a cardinal is *NOT* a type check error, since the different integer types are assignment compatible. It could cause a range check error -- as soon as range checking will be implemented in GPC.
The fact that GPC does report an "incompatible type" here (it didn't in earlier versions, otherwise I'd have noted when I wrote the unit), is indeed a bug in GPC. I'll add it to the bugs section of the To-Do list. Thanks for the (accidental ;-) bug report!
Here is a short example program for this bug. This program should compile, but currently doesn't (it works, however, when I replace the functions v and w by variables):
program x;
procedure a(v:integer;w:cardinal); begin writeln(v,' ',w) end;
function v:cardinal; begin v:=1 end;
function w:integer; begin w:=2 end;
begin a(v,w) end.
Is there some advanced switch that should be used in situations like this to turn off type-checking (I've never really looked at all of the directives and didn't see where they were in the docs after a quick look) and the type-casting section is empty.
Turning off type checking in general would be a bit much, but type casting is indeed the right thing to do. Type casting works like
- variable type casting:
TypeName ( Variable or reference expression {"lvalue"} )
- value type casting (for ordinal and real type values):
TypeName ( expression )
SRand(GetPID);
So change this line to:
SRand(Cardinal(GetPID));