[fpc-pascal] Limits loop for

Jonas Maebe jonas.maebe at elis.ugent.be
Wed May 13 00:04:45 CEST 2009


On 12 May 2009, at 23:22, EC-RED wrote:

> When compiling the following program :
>
> Var a : longWord;
> Begin
> for a:=1 to 4294967294 do   Begin
>   Writeln(a);
> End;
> End.
>
> I get the following error message: "Error : range check error while  
> evaluating constants" and not compiled.
>
> How do I make a loop up to 4294967294?
> What is the limit of a for loop ?

The compiler is currently hardcoded on 32 bit platforms to reject any  
constant for loop bounds smaller than low(longint) or greater than  
high(longint). I think that this is purely historical (the check at  
least predates the switch to svn), and that the maximally allowed  
upper bound should be changed to high(cardinal) on 32 bit platforms  
(on 64 bit platforms, there is no such limitation even today).

You can work around this behaviour by assigning the value 4294967294  
to a variable and by using that variable as the upper bound instead.

On the other hand, the output of Kylix while compiling the program:

$ dcc tt.pp
Borland Delphi for Linux Version 14.5
Copyright (c) 1983,2002 Borland Software Corporation
tt.pp(4) Hint: FOR or WHILE loop executes zero times - deleted
tt.pp(2) Hint: Variable 'a' is declared but never used in 'PROGRAM'
tt.pp(9)
10 lines, 0.00 seconds, 19788 bytes code, 3084 bytes data.

And indeed, when executing the program, nothing is written. So it  
appears to have a similar limit for some reason, although the result  
is different (and assigning the value to a variable and using that as  
an upper bound also makes it work).


Jonas



More information about the fpc-pascal mailing list