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 :

La valeur affectée à X n'est jamais utilisée


Sujet :

Langage Delphi

  1. #1
    Membre actif
    La valeur affectée à X n'est jamais utilisée
    Bonjour à tous

    J'ai un avertissement pour ce code:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            if Ok then begin
                ModeleEnCour.text:=ModeleChampion.text;         //Évolution un nouveau modèle meilleur
                SSEL:=SSEC;
                result:=true;// *****************ici
            end else break;


    Mais si je fais cela :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
             result:=Ok OR result;
            if Ok then begin
                ModeleEnCour.text:=ModeleChampion.text;         //Évolution un nouveau modèle meilleur
                SSEL:=SSEC;
                //result:=true;
            end else break;


    ou cela :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            if Ok then begin
                ModeleEnCour.text:=ModeleChampion.text;         //Évolution un nouveau modèle meilleur
                SSEL:=SSEC;
                result:=true;
            end;
            if not Ok then break;


    Je ne l'ai plus

    Commentaires... suggestions ?

  2. #2
    Membre émérite
    Essaye
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
            result:=false;
            if Ok then begin
                ModeleEnCour.text:=ModeleChampion.text;         //Évolution un nouveau modèle meilleur
                SSEL:=SSEC;
                result:=true;// *****************ici
            end else break;

    ou
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            result:=OK;
            if Ok then begin
                ModeleEnCour.text:=ModeleChampion.text;         //Évolution un nouveau modèle meilleur
                SSEL:=SSEC;
            end else break;


    Sinon la valeur result est dans un état indéterminé si tu ne vérifie pas la condition

  3. #3
    Membre expérimenté
    Bonjour,

    Il me semble que tu n'indiques pas l'avertissement en question, quel est l'avertissement que le compilo indique ?

    As tu initialisé la variable Result ?

  4. #4
    Membre expérimenté
    Ha ok, l'avertissement est dans le titre...

    Ma réponse s'est croisée avec celle d'Alweber, c'est peut être effectivement un problème d'init.

  5. #5
    Rédacteur/Modérateur

    Result se voit affecter deux fois une valeur sans qu'il y ait de traitement sur cette variable entre ces deux affectations.

    Ton code doit ressembler à quelque chose comme ceci :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    for ... do
    begin
      ...
      if Ok then begin
        ModeleEnCour.text:=ModeleChampion.text; 
        SSEL:=SSEC;
        result:=true;   // Provoque l'avertissement puisque Result est réaffecté par la suite sans avoir été utilisé entre-temps
      end else break;
    end;
     
    Result := Ok;  // Rend la première affectation inutile


    Alors que le dernier cas sera plutôt écrit :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Result := FALSE;  // Cette initialisation est nécessaire si OK est toujours FALSE
     
    for ... do
    begin
      ...
      if Ok then begin
        ModeleEnCour.text:=ModeleChampion.text; 
        SSEL:=SSEC;
        result:=true;
      end else break;
    end;


    En bref, c'est ce qui est autour des quelques lignes que tu nous montres qu'il faut regarder.

  6. #6
    Expert éminent sénior
    Citation Envoyé par sgmsg Voir le message
    Commentaires... suggestions ?
    ce message indique généralement que la valeur affectée à une variable n'est jamais exploitée d'une part, et systématiquement remplacée d'autre part, c'est donc dans la suite de ton code qu'il faut voir ce qu'il se passe.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    for ... do
    begin
      ...
      if Ok then begin
        ModeleEnCour.text:=ModeleChampion.text; 
        SSEL:=SSEC;
        result:=true;   // Provoque l'avertissement puisque Result est réaffecté par la suite sans avoir été utilisé entre-temps
      end else break;
    end;
    ...
    Result := True; // ici par exemple, l'affectation au dessus ne sert à rien
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  7. #7
    Membre actif
    Merci de votre intérêt. [Edité pour simplifier]

    Voici un code qui recré l'avertissement
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function Tform1.test:boolean;
    var ok:boolean;
    begin
        result:=false;
        repeat
            Ok:=random(2)>0;
            if not Ok then begin
                Ok:=random(2)>0
            end;
            if Ok then begin
                result:=true;
            end else break;
        until false;
    end;



    Voici le bout de code "corrigé" :
    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
    function Tform1.test:boolean;
    var ok:boolean;
    begin
        result:=false;
        repeat
            Ok:=random(2)>0;
            if not Ok then begin
                Ok:=random(2)>0
            end;
            if Ok then begin
                result:=true;
            end;
            if not Ok then break;
        until false;
    end;

  8. #8
    Rédacteur/Modérateur

    Bonjour,

    j'imagine que le [Édité pour simplifier] fait référence au code, qui a tellement été simplifié qu'il en devient un peu "absurde" ?
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  9. #9
    Rédacteur/Modérateur

    Citation Envoyé par sgmsg Voir le message
    Voici un code qui recré l'avertissement
    Ce qui n'est pas illogique.

    Les résultat de random(2) sera 0 ou 1. La condition Ok est toujours respectée (>=0) et donc Result systématiquement forcé à vrai. result := false est inutile.

  10. #10
    Membre actif
    @ Andnotor
    Le compilateur "ne sait pas" que le résultat est toujours vrai. Il faudrait pour ça qu'il ait l'intelligence de le démontrer.
    Peu importe, en remplaçant "random(2)>=0", par "random(2)>0" l'avertissement est toujours affiché.

    @SergioMaster
    Le code est simplifié pour reproduire le comportement pas pour envoyer l'homme sur la Lune...

    ...

    Ce bout de code
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
            if Ok then begin
                result:=true;
            end else break;


    est fonctionnellement strictement identique à celui-ci
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
            if Ok then begin
                result:=true;
            end;
            if not Ok then break;


    Le premier code
    Si Ok est vrai alors pose result vrai
    Sinon[Si ok est faux] alors sort de la boucle;

    Le second code
    Si Ok est vrai alors pose result vrai;
    Si Ok est faux alors sort de la boucle;

    C'est assez simple comme logique. Le but du code est que Si le traitement est exécuté au moins une fois alors la fonction retourne vrai.

    Pourtant le compilateur Delphi retourne un avertissement pour le premier code et aucun pour le second.

  11. #11
    Membre actif
    Citation Envoyé par ALWEBER Voir le message
    ...

    Sinon la valeur result est dans un état indéterminé si tu ne vérifie pas la condition
    Non puisque result est initialiser à faux au début de la procedure. Il y a toute une série de condition à respecter avant d'essayer de résoudre le problème...
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    result:=false;
    if condition1 then exit;
    if condition2 then exit;
    ...


    Ce qui allège le code de
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    if condition1 then begin result:=false;exit;end;
    if condition2 then begin result:=false;exit;end;
    ...

  12. #12
    Modérateur

    Citation Envoyé par sgmsg Voir le message
    Voici un code qui recrée l'avertissement
    Bonjour,

    Avec Rio 10.3 CE sous W10 et le code qui suit, je n'obtiens pas d'avertissement (cible exe win32), et avec l'autre non plus d'ailleurs...

    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
    function Tform1.Test: Boolean;
    var
     Ok:boolean;
    begin
      result:=false;
      repeat
        Ok:=random(2)>0;
        if not Ok then begin
          Ok:=random(2)>0
        end;
        if Ok then begin
          result:=true;
        end else break;
      until false;
    end;


    Le message d'avertissement est-il réellement "La valeur affectée à X n'est jamais utilisée " ? Quelle est la variable X ?
    Delphi 5 Pro - Delphi 10.3.2 Rio Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  13. #13
    Membre actif
    Citation Envoyé par tourlourou Voir le message
    Bonjour,

    Avec Rio 10.3 CE sous W10 et le code qui suit, je n'obtiens pas d'avertissement (cible exe win32), et avec l'autre non plus d'ailleurs...

    Le message d'avertissement est-il réellement "La valeur affectée à X n'est jamais utilisée " ? Quelle est la variable X ?
    Sérieux?
    J'utilise Seattle...
    Morale c'est un bogue des versions antérieures Delphi.

    X est une fonction, result est le resultat de la fonction un peu comme une affectation de variable.

    Merci tourlourou

    Merci à tous

  14. #14
    Modérateur

    Étrange !
    Avec le code suivant, je n'ai pas d'avertissement ou conseil non plus (auparavant, j'utilisais la valeur de Test1 comme celle de Test2 dans le if :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      Test1;
      if Test2 then
        ShowMessage('OK')
      else
        ShowMessage('raté !');
    end;

    Mais ce n'est pas un bogue pour autant, mais un conseil judicieux : pourquoi définir une fonction plutôt qu'une procédure si on n'utilise pas sa valeur de retour ?
    Delphi 5 Pro - Delphi 10.3.2 Rio Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  15. #15
    Membre émérite
    Bonjour,

    aucun conseil ni avertissement à la compil avec ce code sous D7 :

    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
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
     
    type
      TForm1 = class(TForm)
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
        function Test: Boolean;  end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    function Tform1.Test: Boolean;
    var
     Ok:boolean;
    begin
      result:=false;
      repeat
        Ok:=random(2)>0;
        if not Ok then begin
          Ok:=random(2)>0
        end;
        if Ok then begin
          result:=true;
        end else break;
      until false;
    end;
     
    end.


    Par contre, avant d'appeler Ramdom, il faut appeler Randomize (mais c'est peut être fait dans le code complet)

    A+
    Charly

  16. #16
    Membre actif
    Citation Envoyé par tourlourou Voir le message
    Étrange !
    ...
    Mais ce n'est pas un bogue pour autant, mais un conseil judicieux : pourquoi définir une fonction plutôt qu'une procédure si on n'utilise pas sa valeur de retour ?
    Parce que j'utilise le résultat de la fonction pour terminer le processus d'une fonction qu'il l'appelle.

    Citation Envoyé par Charly910 Voir le message
    Bonjour,

    aucun conseil ni avertissement à la compil avec ce code sous D7 :...

    Par contre, avant d'appeler Ramdom, il faut appeler Randomize (mais c'est peut être fait dans le code complet)

    A+
    Charly
    Je viens de vérifier avec D7, ce que j'aurais dû faire et tu as raison... pas d'avertissement

    Le random était simplement pour obtenir une réponse aléatoire afin d'éviter des ambiguités pour simplifier la compréhension du code.

  17. #17
    Expert éminent sénior
    bon il y a peut-être un bug dans le compilateur, mais quand je n'arrive pas à comprendre une code de 10 lignes à la 3ième lecture je me dis qu'il y a un truc pas net

    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
     
    function Tform1.test:boolean;
    var ok:boolean;
    begin
        result:=false;
        repeat
            Ok:=random(2)>0;
            if not Ok then begin
                Ok:=random(2)>0
            end;
            if Ok then begin
                result:=true;
            end else break;
        until false;
    end;


    si random(2) > 0 alors Result = True et je boucle
    si random(2) = 0 alors si random(2) > 0 alors result = True et je boucle
    si random(2) = 0 et si random(2) = 0 alors je quitte la boucle

    alors sauf à avoir une raison pour boucler, je dirais
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
      Result := (Random(2) > 0) or (Random(2) > 0); // deux tentatives
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  18. #18
    Membre actif
    Citation Envoyé par Paul TOTH Voir le message
    bon il y a peut-être un bug dans le compilateur, mais quand je n'arrive pas à comprendre une code de 10 lignes à la 3ième lecture je me dis qu'il y a un truc pas net
    ...

    alors sauf à avoir une raison pour boucler, je dirais
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
      Result := (Random(2) > 0) or (Random(2) > 0); // deux tentatives
    Bon le premier test est pour forcer l'introduction d'une variable quand il n'y a aucun élément initial.. autrement dit pour initialiser le vecteur vide à la première itération avec la valeur optimale du moment (car je ne peux pas faire de test statistique d'un modèle à une variable avec un modèle à zéro variable.

    Quand, on ne peut plus ajouter de variables, la routine se termine. Une autre routine vérifie si parmi toutes les variables ajoutées précédemment, on peut en retirer certaines.

    Ensuite on revient dans la routine initiale avec un vecteur contenant désormais des variables, et on tente d'en rajouter d'autres... Puis on repasse à la seconde qui tente de retirer d'autres variable. Ce processus se répète jusqu'au point où on ne peut plus ajouter de variables ni en retirer. Alors c'est terminer

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Ok:=Nombre de Variable du modèle initiale=0
    if not Ok then begin Ok:=Il est justifier d_accepter une nouvelle variable;
    if Ok then begin ajoute la nouvelle variable;result:=true;end; 
    if not Ok then quitte la routine.


    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
    repeat
    ....
            Ok:=(ModeleEnCour.count=0);                               //premère variable insérer automatiquement accepte
            if not Ok then begin
                K:=Population-ModeleChampion.count-2;
                Fc:=K*(SSEL-SSEC);{/1}//SSEC
                //Ok:=FSnedecor(ModeleEnCour.count,ModeleChampion.count,Alpha)>Fc;
                Ok:=FSnedecor(1,Population-ModeleChampion.count,Alpha)>Fc;
            end;
            if Ok then begin
                ModeleEnCour.text:=ModeleChampion.text;         //Évolution un nouveau modèle qui est meilleur
                SSEL:=SSEC;
                result:=true;
            end;
            if not Ok then break;                                     //C'est fini;
        until false;

  19. #19
    Membre émérite
    Bonjour,

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    Repeat
      ...
    Until False


    Je n'aurai jamais pensé à cela ! Il faut être sûr que le compilo l'accepte (car False ne peut jamais être égal à True !!) et ensuite que l'on sorte du Repeat.

    Je vais essayer pour voir

    A+
    Charly

  20. #20
    Expert éminent sénior
    Citation Envoyé par Charly910 Voir le message
    Bonjour,

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    Repeat
      ...
    Until False


    Je n'aurai jamais pensé à cela ! Il faut être sûr que le compilo l'accepte (car False ne peut jamais être égal à True !!) et ensuite que l'on sorte du Repeat.

    Je vais essayer pour voir

    A+
    Charly
    c'est la syntaxe utilisée classiquement pour éviter un GOTO, c'est à dire une boucle inconditionnelle
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store