IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

[Delphi2005] Comportement des itérateurs de type intervalle dans les boucles for


Sujet :

Delphi

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Avril 2002
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Consultant ERP
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2002
    Messages : 26
    Points : 36
    Points
    36
    Par défaut [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 : 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.
    Le résultat est le listing des entiers de 9 à 255...
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    [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 : 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;
    Sinon, il vaut mieux utiliser le type integer.

    Etonnant, non ?

  2. #2
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 561
    Points : 3 951
    Points
    3 951
    Par défaut
    Salut

    T'as le bonjour du Doubs.
    Pas le temps de regarder le pb.

    @+

    e-ric

  3. #3
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 875
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 875
    Points : 15 293
    Points
    15 293
    Par défaut
    L'expression constante dépasse les limites de sous-étendue
    Normal, non ? ChiffreMin tu l'as initialisé à 0.
    Et -1 de 0 ça fait -1, et i est du type TChiffre dont -1 inexistant.
    Enfin, il me semble
    Mes 2 cts,
    --
    jp

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Avril 2002
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Consultant ERP
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2002
    Messages : 26
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par Jipété
    Normal, non ? ChiffreMin tu l'as initialisé à 0.
    Et -1 de 0 ça fait -1, et i est du type TChiffre dont -1 inexistant.
    Enfin, il me semble
    Mes 2 cts,
    --
    jp
    Le problème n'était pas là, le message d'erreur lui était normal !
    Ce qui n'est pas normal, c'est le résultat du code que j'ai montré : l'itérateur va de 9 à 255 alors qui ne devrait même pas espérer entrer dans la boucle.

    Mais en utilisant un integer comme itérateur, ça marche.

    Je voulais simplement alerter du problème et/ou avoir un avis sur ce comportement de Delphi si quelqu'un en a un.

    e-ric je t'avais vu sur le message précédent mais après le dépôt de cette discussion, ça m'a fait un tel effet e-ric !
    Bon courage pour cette semaine de tu sais quoa.

Discussions similaires

  1. Réponses: 5
    Dernier message: 05/07/2011, 14h45
  2. Réponses: 1
    Dernier message: 22/11/2007, 22h52
  3. Réponses: 3
    Dernier message: 16/10/2006, 11h06
  4. Réponses: 4
    Dernier message: 29/08/2006, 14h52
  5. Réponses: 7
    Dernier message: 13/03/2006, 08h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo