Du point de vue de la mémoire, $800000
se situe en effet dans la fourchette de Cardinal
.
J'ai pensé qu'il s'agissait de la Cardinal($800000)
typecast permettrait de résoudre le problème, mais ce n'est pas le cas.
Delphi XE7 et les versions ultérieures compilent correctement votre code.
Cela échoue également jusqu'à Delphi XE6 avec la même erreur :
const
CardinalArray: array of Cardinal = [257];
Je pense que la raison en est que le compilateur Delphi voit [257]
en tant que set
, bien que le côté gauche indique qu'il est censé être un array
.
Cela échoue dans XE4, mais compile bien dans XE7 et les versions ultérieures :
program Cardinals;
{$APPTYPE CONSOLE}
uses
System.SysUtils;
const
CardinalArray: array of Cardinal = [257]; // fails until Delphi XE4 with "E1012 Constant expression violates subrange bounds"
const
ANSICOLORS: array of Cardinal = [
$000000,//0
$800000,//1, compilation error starts with this value
$008000,//2
$808000,//3
$000080,//4
$800080,//5
$008080,//6
$D0D0D0,//7
$3F3F3F,//8
$FF0000,//9
$00FF00,//A
$FFFF00,//B
$0000FF,//C
$FF00FF,//D
$00FFFF,//E
$FFFFFF];//F
var
AnsiColor: Cardinal;
begin
try
for AnsiColor in AnsiColors do
Writeln(Format('$%6.6x', [AnsiColor]));
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
Sortie :
$000000
$800000
$008000
$808000
$000080
$800080
$008080
$D0D0D0
$3F3F3F
$FF0000
$00FF00
$FFFF00
$0000FF
$FF00FF
$00FFFF
$FFFFFF
Si vous pouvez vous accommoder d'un tableau non dynamique, l'exemple ci-dessous fonctionne dans Delphi XE4 (je l'ai testé jusqu'à Delphi 2007, pour XE et les versions antérieures, vous devez remplacer System.SysUtils
con SysUtils
)).
Notez les interrupteurs :
- de
array of Cardinal
a array[0..15] of Cardinal
-
de [
y ]
a (
y )
program Cardinals;
{$APPTYPE CONSOLE}
//{$R *.res}
uses
System.SysUtils;
const
ANSICOLORS: array[0..15] of Cardinal = (
$000000,//0
$800000,//1, compilation error starts with this value
$008000,//2
$808000,//3
$000080,//4
$800080,//5
$008080,//6
$D0D0D0,//7
$3F3F3F,//8
$FF0000,//9
$00FF00,//A
$FFFF00,//B
$0000FF,//C
$FF00FF,//D
$00FFFF,//E
$FFFFFF);//F
var
AnsiColor: Cardinal;
begin
try
for AnsiColor in AnsiColors do
Writeln(Format('$%6.6x', [AnsiColor]));
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.