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 :

Variable de For après la boucle


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Variable de For après la boucle
    Dans les premières versions de Delphi, l'utilisation de la variable For après la boucle est déconseillée et sa valeur peut être indéfinie. pourtant je suis tombé sur ce bout de code dans TOleControl.GetEventMethod qui montre l'inverse .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
       for Index := 0 to FControlData^.EventCount-1 do
      begin
        if DispID = PID^ then
          break;
        Inc(PID);
      end;
     
      if Index = FControlData^.EventCount then
      begin
        Method.Code := nil;
        Method.Data := nil;
        Exit;
      end;
    ..

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    410
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 410
    Par défaut
    le compteur est dans un état indéterminé à la fin de la boucle sauf après un break ou un exit, mais le code me parait quand même bancal

  3. #3
    Membre chevronné Avatar de der§en
    Homme Profil pro
    Bretagne
    Inscrit en
    Septembre 2005
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bretagne
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 144
    Par défaut
    Je me demande quel contexte renvoi TRUE dans ce test : if Index = FControlData^.EventCount then !

  4. #4
    Membre expérimenté
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Décembre 2014
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant fonctionnel

    Informations forums :
    Inscription : Décembre 2014
    Messages : 115
    Par défaut
    Bjr,
    C'est normal, une boucle for incrémente "Index".
    Si la boucle for va de 0 à Count-1, et si elle termine sa boucle, l'index sera égal à Count et ne sera pas indéfini.
    (sera égal à la valeur du "to" +1, ou du "downto" -1)

  5. #5
    Membre émérite
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    458
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 458
    Par défaut
    Bonjour,

    Citation Envoyé par solilog Voir le message
    Bjr,
    C'est normal, une boucle for incrémente "Index".
    Si la boucle for va de 0 à Count-1, et si elle termine sa boucle, l'index sera égal à Count et ne sera pas indéfini.
    (sera égal à la valeur du "to" +1, ou du "downto" -1)
    J'y crois de moins en moins. La première version du pascal (définie par Wirth) dit que l'index de la boucle est indéfini à la sortie normale de la boucle? Et je n'ai pas vu que le vendeur de DELPHI ait modifié cet état de choses.

    Lorsque un boucle comme celle que tu montres est aussi petite, Un index de boucle peut valoir tout et n'importe quoi à la sortie d'une boucle (sauf en cas de sortie prématurée break par exemple)
    En particulier, selon le niveau d'optimisation ou la version du compilateur, la boucle peut être faite avec un registre et en sortie normale l'index peut valoir à peu près n'importe quoi!

    Lorsque j'ai des choses comme ça à faire, j'utilise en général une variable intermédiaire...

    Cordialement

  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 968
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 968
    Par défaut
    Il faudrait voir le contexte général mais je n'écrirais pas ce genre de code.

    • Comment être sûr que l'optimisation n'a pas généré une boucle descendante, index n'étant pas utilisé à l'intérieur de cette boucle ?
    • Si EventCount vaut 0 nous n'entrons pas dans la boucle, que vaut index ?
    • Considérer que si la boucle va à son terme et est ascendante index vaudra ValeurMax +1 ne pourrait être "valide" que si cette valeur max est inférieure au high du type, sinon elle vaudra 0 si non signée ou une valeur négative.


    Grosse prise de tête en perspective pour pas grand chose à mon avis, surtout qu'ici on connait pertinemment le nombre max de pas et donc le pointeur PID max, on pourrait tester son dépassement

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Python 2.X] Décomposition de variable après une boucle for
    Par Clovis78 dans le forum Général Python
    Réponses: 2
    Dernier message: 21/12/2020, 21h51
  2. [MySQL] lecture en boucle for après mysql_fetch_array
    Par SmileAndFly dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 30/01/2009, 14h47
  3. Variables de session dans une boucle for
    Par lavande4 dans le forum Langage
    Réponses: 1
    Dernier message: 25/10/2008, 15h33
  4. Gérer mes variables après une boucle
    Par Snipy dans le forum Langage
    Réponses: 10
    Dernier message: 06/05/2008, 13h09
  5. [RegEx] problème variable au sein d'une boucle for
    Par mussara dans le forum Langage
    Réponses: 4
    Dernier message: 22/06/2006, 15h26

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