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 :
Le résultat est le listing des entiers de 9 à 255...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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.![]()
Ce qui est surprenant c'est que si on remplace dans la boucle for UnChiffre par ChiffreMin, on a l'erreur suivante à la compilation :
Il faut donc faire attention avec les types intervalles dans les boucle for et se limiter à des boucles du genre :
Code : Sélectionner tout - Visualiser dans une fenêtre à part [Erreur] main.pas(34): E1012 L'expression constante dépasse les limites de sous-étendue
Sinon, il vaut mieux utiliser le type integer.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 var i : TIntervalle; for i:=Low(TIntervalle) to High(TIntervalle) do ... end;
Etonnant, non ?
Partager