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

Lazarus Pascal Discussion :

Variable change de valeur selon la météo et l'âge du capitaine [Lazarus]


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 120
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 120
    Par défaut Variable change de valeur selon la météo et l'âge du capitaine
    Bonjour,

    Je ne voulais pas vous ennuyer avec mes problèmes métaphysiques mais quand je tombe sur ce que je vais vous conter ci-après, 1), je tombe par terre et 2), je me sens obligé de partager.

    Donc, pour raccourcir des lignes de code un peu longues et pas très lisibles ainsi que pour économiser des calculs, je décide de remplacer length(TestDir)+1 par lenTestDir avec lenTestDir := length(TestDir)+1;, et TestDir n'est qu'une bête string utilisée comme constante.
    Je pars de ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for i := 0 to mmoTemp.Lines.Count-1 do 
      mmoFoldersForFonts.Lines.Add(copy(mmoTemp.Lines[i],length(TestDir)+1,length(mmoTemp.Lines[i])-length(TestDir)+1));
    et ça donne ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for i := 0 to mmoTemp.Lines.Count-1 do 
      mmoFoldersForFonts.Lines.Add(copy(mmoTemp.Lines[i],lenTestDir,length(mmoTemp.Lines[i])-lenTestDir));
    Et que croyez-vous qu'il arrivât ?
    J'ai un dossier nommé "vide" : la première ligne de code affiche "vide", la seconde "vid" et pareil pour tous les autres dossiers, il manque la dernière lettre !

    Je mets ci-après juste la partie incriminée des bouts de code en mode comparaison graphique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ...copy( mmoTemp.Lines[i], length(TestDir)+1, length(mmoTemp.Lines[i])-length(TestDir)+1 ); // ok
    ...copy( mmoTemp.Lines[i], lenTestDir       , length(mmoTemp.Lines[i])-lenTestDir        ); // kc
    //Et pour que je retrouve des résultats corrects, il me faut bidouiller, avec ce +1 rajouté dessous
    ...copy( mmoTemp.Lines[i], lenTestDir       , length(mmoTemp.Lines[i])-lenTestDir+1)     ); // ok
    Alors, elle est où, la blague ? (pourquoi la vie est-elle si compliquée, et l'informatique encore plus ?)

    Au plaisir de vous lire,

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 930
    Par défaut
    Pas bien réveillé ce matin hein

    length(mmoTemp.Lines[i])-lenTestDir ne correspond pas à length(mmoTemp.Lines[i])-length(TestDir)+1 mais à length(mmoTemp.Lines[i])-(length(TestDir)+1).

    Mais ce p'tit calcul est parfaitement inutile, copy n'ira pas au-delà de la fin de chaîne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for i := 0 to mmoTemp.Lines.Count-1 do 
      mmoFoldersForFonts.Lines.Add(copy(mmoTemp.Lines[i], length(TestDir)+1, MAXINT));

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 120
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Pas bien réveillé ce matin hein
    Probable,

    Citation Envoyé par Andnotor Voir le message
    copy n'ira pas au-delà de la fin de chaîne.
    Voilà quelque chose que j'ignorais.

    Ceci étant dit, je ne comprends pas.
    J'utilise la coloration des couples ( ) pour m'y retrouver, et je vois bien que la dernière parenthèse correspond à avant_copy, celle qui suit copy correspond à après MAXINT, après +1, après lenTestDir et après +1.
    Et pour moi, dans ma petite tête de piaf, je considère que la valeur de lenTestDir est égale à celle de l'opération length(TestDir)+1, or on ne dirait pas.
    C'est ça qui me choque.
    Code pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for i := 0 to mmoTemp.Lines.Count-1 do begin
      mmoFoldersForFonts.Lines.Add(copy( mmoTemp.Lines[i], lenTestDir, MAXINT) ); // ok
      mmoFoldersForFonts.Lines.Add(copy( mmoTemp.Lines[i], length(TestDir)+1, length(mmoTemp.Lines[i])-length(TestDir)+1 ) ); // ok
      mmoFoldersForFonts.Lines.Add(copy( mmoTemp.Lines[i], lenTestDir       , length(mmoTemp.Lines[i])-lenTestDir        ) ); // kc
      mmoFoldersForFonts.Lines.Add(copy( mmoTemp.Lines[i], lenTestDir       , length(mmoTemp.Lines[i])-lenTestDir+1      ) ); // ok
    end;
    Si je fais lenTestDir := length(TestDir)+1; je ne vois pas pourquoi j'ai un résultat faux sur l'avant-dernière ligne puisque lenTestDir est égal à length(TestDir)+1
    Ou alors c'est un truc énorme mais je ne le vois pas...

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 930
    Par défaut
    Admettons une chaîne de 10 caractères et un TestDir de 3 ; tu dois copier 7 caractères.

    length(mmoTemp.Lines[i])-length(TestDir)+1 = 10 -3 +1 = 8 : un caractère de trop, tu vas au-delà comme avec MAXINT mais le résultat est correct puisque limité à la fin de chaîne.

    length(mmoTemp.Lines[i])-lenTestDir = 10 -(3 +1) = 6 : il manque un caractère.


    +1 est correct pour l'indice puisque tu veux le 1er caractère suivant TestDir mais n'a pas lieu d'être pour la longueur : length(mmoTemp.Lines[i]) -length(TestDir).

  5. #5
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 120
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 120
    Par défaut
    Vu.

    En résumé,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    mmoFoldersForFonts.Lines.Add(copy( mmoTemp.Lines[i], lenTestDir, length(mmoTemp.Lines[i])-lenTestDir)      ); // kc
    mmoFoldersForFonts.Lines.Add(copy( mmoTemp.Lines[i], lenTestDir, length(mmoTemp.Lines[i])-length(TestDir)) ); // ok
    mmoFoldersForFonts.Lines.Add(copy( mmoTemp.Lines[i], lenTestDir, length(mmoTemp.Lines[i])-lenTestDir+1)    ); // ok
    Je m'étais bien pris les pieds dans le tapis...

    Merci à toi et bon après-midi,

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 01/04/2018, 18h31
  2. [Débutant] comment savoir si une variable change de valeur
    Par lou87 dans le forum C#
    Réponses: 6
    Dernier message: 30/03/2012, 10h25
  3. [AC-2007] variable change de valeur en changeant de sub
    Par Alain7751 dans le forum VBA Access
    Réponses: 1
    Dernier message: 04/07/2010, 21h16
  4. [DEBUTANT] Evenement lorsqu'une variable change de valeur
    Par erigoal dans le forum Windows Forms
    Réponses: 11
    Dernier message: 25/05/2009, 00h03
  5. Pause dans un programme lorsqu'une variable change de valeur.
    Par Jérôme Lambert dans le forum Visual Studio
    Réponses: 5
    Dernier message: 21/10/2008, 11h26

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