T.Moore@massey.ac.nz (T. Moore) (01/09/91)
A Possible bug in Top Speed Modula 2
The Lib.Delay function takes a CARDINAL number as its argument.
If we declare
VAR x : SHORTCARD;
and assign
x := 50;
then the call
Lib.Delay(CARDINAL(250 DIV x));
delays for 5 milliseconds.
But the call
Lib.Delay(CARDINAL(300 DIV x));
delays for less than 6 milliseconds.
The call
IO.WrCard(CARDINAL(300 DIV x));
will explain why.
In deciding whether to represent 250 as CARDINAL or SHORTCARD, the
decision is made on the basis that it will be combined with a SHORTCARD.
The value of 300 is forced to be SHORTCARD, presumably by deleting the
first byte. (Or perhaps the division algorithm does not check that the 300
is stored as a SHORTCARD.)
Should the compiler have produced a syntax error on trying to store 300
as SHORTCARD? (Or when trying to divide a CARDINAL by a SHORTCARD).
The correct call should be
Lib.Delay(300 DIV CARDINAL(x));
But I still think the compiler should have told me.
What do other modula2 compilers do?
--
Terry Moore <T.Moore@massey.ac.nz>
Department of Mathematics and Statisics,
Massey University, Palmerston North, New Zealand
Kroneker: "God made the natural numbers, the rest is the work of man."
Zermelo: "But I can construct the natural from the empty set alone."
Bystander: "Who said 'You can't get something for nothing.'?"