6 votes

La constante `array of cardinal` produit l'erreur 'Constant expression violates subrange bounds"

Pourquoi le code suivant :

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

Il produit l'erreur de compilation suivante sous Delphi XE4 (win32 et win64) :

[Erreur dcc32] Debug.pas(66) : E1012 L'expression de la constante viole les limites de la sous-gamme

La valeur n'est pas $800000 dans la fourchette de Cardinal ?

8voto

LU RD Points 13180

Vous utilisez une fonctionnalité introduite dans XE7.

Déclaration d'une constante de tableau dynamique.

Tableaux dynamiques_Delphi xe7 et

String-Like_Operations_Supported_on_Dynamic_Arrays (opérations similaires à des chaînes de caractères prises en charge sur des tableaux dynamiques)


Dans le XE4, cette valeur est évaluée comme un ensemble, où l'ordinalité ne peut pas dépasser 255.

D'où l'erreur E1012 Constant expression violates subrange bounds

Corrigez le problème en déclarant :

const
  ANSICOLORS: array[0..15] of cardinal = (
    $000000,//0
    $800000,//1, 
    $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

4voto

Jeroen Wiert Pluimers Points 17529

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X