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 :

Eliminer 'La variable n'est peut-être pas initialisée'


Sujet :

Delphi

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Points : 777
    Points
    777
    Par défaut Eliminer 'La variable n'est peut-être pas initialisée'
    Bonjour,

    J'ai un bout de code qui utilise une variable (Integer) et Delphi me colle ce warning à la compilation...
    [DCC Avertissement] fmMain.pas(2069): W1036 La variable 'iAreaID' n'est peut-être pas initialisée
    Je sais de quoi il s'agit, j'ai un "Continue" qui contourne parfois le code faisant utilisation de cette variable...
    Le problème est que si je force l'initialisation de la variable, alors à la compilation j'ai le warning...
    [DCC Conseil] fmMain.pas(2057): H2077 La valeur affectée à 'iAreaID' n'est jamais utilisée
    Auriez-vous une astuce pour faire disparaître ces warnings ? Je pense que le compilo s'emmêle les pinceaux !

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut
    Il faut placer l'initialisation au bon endroit...

    Ce serait plus facile de te dire où si on avait le bout de code en question

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Points : 777
    Points
    777
    Par défaut
    Je crois que j'ai a peu près tout essayé :-\
    Voici mon code très simplifié (de mémoire)...

    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
    procedure Test(const slUrls: TStringList);
    var
      sl: TStringList;
      sUrl, sCompetitionUrl: string;
      iAreaID: Integer;
    begin
      sl := TStringListCreate;
      try
        for sUrl in slUrls do begin
          with qry do begin
            // iAreaID := 0; // Evite le warning W1036 à la compilation mais fait apparaître H2077 !
     
            SQL.Text := 'SELECT ID FROM Areas WHERE Url = :p0;';
            Params[0].AsString := sUrl;
            Open;
            if not Eof then
              iAreaID := Fields[0].AsInteger
            else begin
              DoSomething;
              Continue;
            end;
     
            SQL.Text := 'SELECT Url FROM Competitions WHERE Area = :p0 AND Type = 1;';
            Params[0].AsInteger := iAreaID; // !!! ICI !!! Warning "peut-être pas utilisée"
            Open;
            if not Eof then
              sCompetitionUrl := Fields[0].AsString
            else begin
              DoSomething2;
              Continue;
            end;
     
            // Encore du code utilisant sCompetitionUrl et sl...
            // DoSomething3;
          end;
        end;
      finally
        sl.Free;
      end;
    end;

  4. #4
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    Le compilateur ne gère pas le 'continue' pour savoir ce qui est utilisé ou pas.

    As-tu essayé ceci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
            SQL.Text := 'SELECT ID FROM Areas WHERE Url = :p0;';
            Params[0].AsString := sUrl;
            Open;
            if not Eof then
              iAreaID := Fields[0].AsInteger
            else begin
              iAreaID := 0; // Dans les deux cas du IF iAreaID sera initialisé
              DoSomething;
              Continue;
            end;
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Points : 777
    Points
    777
    Par défaut
    Si je fais ça, je n'ai plus le warning mais j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [DCC Conseil] fmMain.pas(2060): H2077 La valeur affectée à 'iAreaID' n'est jamais utilisée

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Hé ben, GoustiFruit, c'est la chaleur ?
    Citation Envoyé par GoustiFruit Voir le message
    Si je fais ça, je n'ai plus le warning mais j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [DCC Conseil] fmMain.pas(2060): H2077 La valeur affectée à 'iAreaID' n'est jamais utilisée
    D'après le bout de code que tu montres, on voit que ta variable n'est pas utilisée, après l'affectation d'une valeur,
    style if iAreaID = 0 then une_action else autre_action;, donc à quoi elle sert ? À rien ?

    Enfin, il me semble (c'est vrai qu'il fait chaud, fouhhh ! )
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  7. #7
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    Autre essai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
           SQL.Text := 'SELECT ID FROM Areas WHERE Url = :p0;';
            Params[0].AsString := sUrl;
            Open;
            if Eof then
            begin
              DoSomething;
              Continue;
            end;
            iAreaID := Fields[0].AsInteger
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  8. #8
    Membre confirmé

    Homme Profil pro
    Chef de Projet ATIC
    Inscrit en
    Novembre 2005
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Chef de Projet ATIC
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2005
    Messages : 274
    Points : 508
    Points
    508
    Par défaut
    Hello,

    Sinon, avec la directive {$WARNINGS OFF} pour l'ensemble de ta fonction.

  9. #9
    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 : 54
    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 445
    Points
    28 445
    Par défaut
    dans ce genre de cas où le code contient trop de "continue" ou de if/then/else, j'utilise un Case Of avec des appels de fonction dans les Case, ça rend les choses beaucoup plus claires.

    ou encore des fonctions du type

    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
     
    function getAreasID(const Url: string; var ID: Integer): Boolean;
    begin
      ..
    end;
    function getCompetitionsURL(ID: Integer; var URL: string): Boolean;
    begin
      ..
    end;
     
    begin
      if getAreasID(sURL, iAreaID) then
      begin
       if getCompetitionsURL(iAreaID, sCompetitionUrl) then
       begin
       end else begin
       end;
      end else begin
      end;
    end;
    je trouve cela beaucoup plus élégant que le code folding, et ça pousse à la factorisation au lieu du copier/coller
    Sinon, le compilateur devrait accepté un iAreaID := 0 en tout début de fonction.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Points : 777
    Points
    777
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    je trouve cela beaucoup plus élégant que le code folding, et ça pousse à la factorisation au lieu du copier/coller
    Sinon, le compilateur devrait accepté un iAreaID := 0 en tout début de fonction.
    Non, en initialisant la variable en début de fonction j'ai le même message "H2067" !

    Ce que tu appelle "code folding", c'est l'imbrication des sous-procédures, comme dans la deuxième partie de ton code ? J'utilise des Continue justement pour éviter ça. Mon exemple est très simplifié mais j'ai un certain nombre de variables qui réagissent de la même manière (soit le compilo me dit qu'elle ne sont pas initialisées, soit j'initialise et il me dit qu'elles ne sont pas utilisées) et imbriquer la série de tests rend le code trop touffu !

    Citation Envoyé par Okaryn
    Sinon, avec la directive {$WARNINGS OFF} pour l'ensemble de ta fonction.
    Je préfère éviter, j'aime savoir que mon code est "propre"

    Citation Envoyé par Jipété
    Hé ben, GoustiFruit, c'est la chaleur ?
    Non il faisait encore frais quand j'ai posté ! Par contre chez toi... ?
    La variable est bien utilisée, après le "Continue" (voir premier post).

    Citation Envoyé par Nono40
    Autre essai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      SQL.Text := 'SELECT ID FROM Areas WHERE Url = :p0;';
      Params[0].AsString := sUrl;
      Open;
      if Eof then  begin
        DoSomething;
        Continue;
      end;
      iAreaID := Fields[0].AsInteger
    Et c'est Nono40 qui remporte la palme, félicitations !

    Merci à tous !

  11. #11
    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 : 54
    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 445
    Points
    28 445
    Par défaut
    le "Code folding" c'est quand un éditeur te permet de masquer un gros paquet de code en cliquant sur un signe "-" pour rendre ton code plus digeste....alors qu'il ne l'est pas
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Yop !
    Citation Envoyé par GoustiFruit Voir le message
    (...) Je préfère éviter, j'aime savoir que mon code est "propre"
    + 1 !

    Citation Envoyé par GoustiFruit Voir le message
    (...) Non il faisait encore frais quand j'ai posté ! Par contre chez toi... ?
    Ben c'est terrible depuis 3 soirs...
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

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

Discussions similaires

  1. COMException : Word n'a pas pu lire ce document. Il est peut-être corrumpu.
    Par bitwise dans le forum Développement Office System
    Réponses: 0
    Dernier message: 19/11/2014, 10h06
  2. Réponses: 4
    Dernier message: 06/11/2013, 22h21
  3. Réponses: 8
    Dernier message: 28/02/2008, 13h41
  4. Réponses: 1
    Dernier message: 30/04/2007, 15h55
  5. Problème de variables peut être pas intialisées
    Par gregory.bts dans le forum Langage
    Réponses: 14
    Dernier message: 12/10/2006, 09h55

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