[Delphi2005] Comportement des itérateurs de type intervalle dans les boucles for
Bonjour,
Je suis tombé sur un problème qui mérite réflexion.
J'ai corrigé le problème mais néanmoins, je pense que c'est important d'en parler.
Delphi est un langage fortement typé. Ça permet (entre autres) de laisser faire les exceptions standard contrôler les valeurs hors limites.
Néanmoins je me suis fait avoir dans les boucles for en utilisant des types intervalle.
Voici un petit exemple où j'ai mis le résultat dans un mémo :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
|
unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
const ChiffreMin = 0;
ChiffreMax = 9;
type
TChiffre = ChiffreMin..ChiffreMax;
TForm1 = class(TForm)
Memo1: TMemo;
procedure FormShow(Sender: TObject);
private
{ Déclarations privées }
public
{ Déclarations publiques }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormShow(Sender: TObject);
// Si i est de type integer, ça fonctionne normalement :
// rien ne s'affiche.
var i, UnChiffre : TChiffre;
begin
UnChiffre:=0;
// Si on remplace dans le for UnChiffre par ChiffreMin,
// on a une erreur de compilation E1012.
for i:=ChiffreMax to UnChiffre-1 do
Memo1.Lines.Add(IntToStr(i));
end;
end. |
Le résultat est le listing des entiers de 9 à 255... :aie:
Ce qui est surprenant c'est que si on remplace dans la boucle for UnChiffre par ChiffreMin, on a l'erreur suivante à la compilation :
Code:
[Erreur] main.pas(34): E1012 L'expression constante dépasse les limites de sous-étendue
Il faut donc faire attention avec les types intervalles dans les boucle for et se limiter à des boucles du genre :
Code:
1 2 3 4
| var i : TIntervalle;
for i:=Low(TIntervalle) to High(TIntervalle) do
...
end; |
Sinon, il vaut mieux utiliser le type integer.
Etonnant, non ?