[fpc-devel] Val() behaviour in a function depends on LongStrings ON/OFF?
Bart
bartjunk64 at gmail.com
Wed Oct 14 20:24:48 CEST 2026
Hi,
This is driving me crazy.
Val('256', AByte, Code) should fail.
It does, but sometimes it does not.
===========
uses
sysutils;
{$PUSH}
{$R+}
function TryStrToByte_RangeCheck_ON(const S: String; out B: Byte): Boolean;
var
Err: Integer;
begin
Val(S, B, Err);
Result := (Err = 0);
end;
{$R-}
function TryStrToByte_RangeCheck_OFF(const S: String; out B: Byte): Boolean;
var
Err: Integer;
begin
Val(S, B, Err);
Result := (Err = 0);
end;
{$POP}
var
B: Byte;
Err: Integer;
begin
{$PUSH}
{$R+}
writeln('Val()');
writeln('RangeCheck ON');
Val('256', B, Err);
writeln('Err=',Err);
if (Err=0) then writeln('B=',B);
{$R-}
writeln('RangeCheck OFF');
Val('256', B, Err);
writeln('Err=',Err);
if (Err=0) then writeln('B=',B);
{$POP}
writeln;
writeln('TryStrToByte_RangeCheck_ON');
try
if TryStrToByte_RangeCheck_ON('256', B) then writeln('Ok [',B,']')
else writeln('NOT a Byte');
except
on E: Exception do writeln(E.ToString);
end;
writeln('TryStrToByte_RangeCheck_OFF');
try
if TryStrToByte_RangeCheck_OFF('256', B) then writeln('Ok
[',B,']') else writeln('NOT a Byte');
except
on E: Exception do writeln(E.ToString);
end;
end.
===========
C:\Users\Bart\LazarusProjecten\ConsoleProjecten>fpc test.pas -Mobjfpc
Free Pascal Compiler version 3.3.1 [2026/04/05] for i386
Copyright (c) 1993-2026 by Florian Klaempfl and others
Target OS: Win32 for i386
Compiling test.pas
Linking test.exe
56 lines compiled, 0.1 sec, 75632 bytes code, 4804 bytes data
C:\Users\Bart\LazarusProjecten\ConsoleProjecten>test
Val()
RangeCheck ON
Err=3
RangeCheck OFF
Err=3
TryStrToByte_RangeCheck_ON
NOT a Byte
TryStrToByte_RangeCheck_OFF
NOT a Byte
C:\Users\Bart\LazarusProjecten\ConsoleProjecten>fpc test.pas -Mobjfpc -Sh
Free Pascal Compiler version 3.3.1 [2026/04/05] for i386
Copyright (c) 1993-2026 by Florian Klaempfl and others
Target OS: Win32 for i386
Compiling test.pas
Linking test.exe
56 lines compiled, 0.1 sec, 75728 bytes code, 4804 bytes data
C:\Users\Bart\LazarusProjecten\ConsoleProjecten>test
Val()
RangeCheck ON
Err=3
RangeCheck OFF
Err=3
TryStrToByte_RangeCheck_ON
ERangeError: Range check error
TryStrToByte_RangeCheck_OFF
Ok [0]
C:\Users\Bart\LazarusProjecten\ConsoleProjecten>fpc test.pas -MDelphi
Free Pascal Compiler version 3.3.1 [2026/04/05] for i386
Copyright (c) 1993-2026 by Florian Klaempfl and others
Target OS: Win32 for i386
Compiling test.pas
Linking test.exe
56 lines compiled, 0.2 sec, 75728 bytes code, 4804 bytes data
C:\Users\Bart\LazarusProjecten\ConsoleProjecten>test
Val()
RangeCheck ON
Err=3
RangeCheck OFF
Err=3
TryStrToByte_RangeCheck_ON
ERangeError: Range check error
TryStrToByte_RangeCheck_OFF
Ok [0]
Val() in the main begin end. behaves as expected regardless of
RangeChecking and AnsiString/ShortString.
Val() inside the 2 functions depens on AnsiString/ShortString and RangeChecking?
I'm confused.
PEBKAC (been staring at this way too long, so quite possible),
intended behaviour or bug?
--
Bart
More information about the fpc-devel
mailing list