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

Langage Delphi Discussion :

D6 probleme avec la boucle For


Sujet :

Langage Delphi

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2009
    Messages : 322
    Points : 310
    Points
    310
    Par défaut D6 probleme avec la boucle For
    Bonjour à tous

    J'ai un problème récurrent mais intermittent avec les boucles For. On sait pas quand ça arrive, mais ça finit par arriver...

    soit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        for i:=0 to 0 do
           for j:=0 downto 0 do
              beep;
    Dans ce bout de code si je trace avec F7 le curseur programme passe qu'une seule fois sur beep;

    Or

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            for i:=0 to iVecteur do
                for j:=S-iSi-1 downto 0 do
                   Zen[i].Soustrais(Sd[iSi-vecteur[i]-j]);
    Avec iVecteur =0 ainsi que S-iSi-1 = 0

    Alors qu'il ne devrait passer qu'une seule fois, le curseur programme passe deux fois sur Zen[i].Soustrais. Au premier passage il exécute bel et bien Soustrais. Mais au second passage, il s'arrête dessus mais n'appelle pas Soustrais ?!?

    Si je remplace Zen[i].Soustrais(Sd[iSi-vecteur[i]-j]) par beep,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            for i:=0 to iVecteur do
                for j:=S-iSi-1 downto 0 do
                   beep;;
    il ne passe qu'une seule fois.

    Donc ce n'est pas un problème dû aux variables lors de l'initialisation des boucles for.

    Avez vous des explications?

    D'accord ça revient au même mais quand on trace pour déverminer le programme ça fait perdre un temps fou car on cherche à résoudre une punaise qui n'existe pas...

    Merci d'avance.

  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 564
    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 564
    Points : 3 968
    Points
    3 968
    Par défaut
    Salut

    Difficile de juger avec des extrait de code aussi petits. Peux-tu exposer le code de Zen[i].Soustrais().
    As-tu essayer de déboguer avec puis sans les optimisations ?

    Cdlt

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 831
    Points : 13 579
    Points
    13 579
    Par défaut
    Tu te poses des questions existentielles là

    La prochaine instruction machine à exécuter ne correspond à rien dans ton code (c'est en fait la boucle for qui est compilée sous la forme d'un repeat..until, on est sur le until). Le debugger affiche simplement la dernière ligne la plus proche.

    Modifie ton code ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for i:=0 to iVecteur do
      for j:=S-iSi-1 downto 0 do
      begin
        Zen[i].Soustrais(Sd[iSi-vecteur[i]-j]);
      end;
    et la ligne en évidence sera end;.

    Presse Ctrl+Alt+d pour afficher le code machine, c'est très instructif

  4. #4
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 457
    Points
    28 457
    Par défaut
    c'est probablement lié à l'optimisation qui dans le premier cas supprime simplement les boucles for alors que dans le second cas, il évalue l'expression "S-iSi-1", il boucle donc effectivement pour savoir qu'il doit s'arrêter.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2009
    Messages : 322
    Points : 310
    Points
    310
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Tu te poses des questions existentielles là

    La prochaine instruction machine à exécuter ne correspond à rien dans ton code (c'est en fait la boucle for qui est compilée sous la forme d'un repeat..until, on est sur le until). Le debugger affiche simplement la dernière ligne la plus proche.

    Modifie ton code ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for i:=0 to iVecteur do
      for j:=S-iSi-1 downto 0 do
      begin
        Zen[i].Soustrais(Sd[iSi-vecteur[i]-j]);
      end;
    et la ligne en évidence sera end;.

    Presse Ctrl+Alt+d pour afficher le code machine, c'est très instructif
    Effectivement : exactement le comportement que tu avais prédit.

    Mais j'ai deux ligne plus bas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                for i:=0 to iVecteur+1{} do 
                    Zen[i].Additionne(Sd[iSi]);
    Il ne passe qu'une fois...

    J'ai essayé Ctrl+Alt+d: y'a rien qui se passe probablement D6...


    Citation Envoyé par Paul TOTH Voir le message
    c'est probablement lié à l'optimisation qui dans le premier cas supprime simplement les boucles for alors que dans le second cas, il évalue l'expression "S-iSi-1", il boucle donc effectivement pour savoir qu'il doit s'arrêter.
    C'est peut-être ça...

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

Discussions similaires

  1. VBA ACCESS probleme avec une boucle for
    Par maldini dans le forum VBA Access
    Réponses: 2
    Dernier message: 20/04/2010, 10h52
  2. Probleme avec la boucle for
    Par developpeur82 dans le forum MATLAB
    Réponses: 1
    Dernier message: 31/05/2007, 12h40
  3. Incrémentation dynamique d'un textbox avec une boucle for
    Par Etanne dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 06/03/2006, 16h17
  4. Erreur avec la boucle For
    Par Harvester dans le forum Langage
    Réponses: 3
    Dernier message: 06/11/2005, 17h46
  5. : remplir des zones de texte avec une boucle For
    Par Haro_GSD dans le forum Access
    Réponses: 3
    Dernier message: 20/09/2005, 22h23

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