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 :

Ligne non compilé et problème sur un test d'égalité [Delphi 5]


Sujet :

Delphi

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 8
    Points : 9
    Points
    9
    Par défaut Ligne non compilé et problème sur un test d'égalité [Delphi 5]
    Bonjour à tous,

    Je travail actuellement sous Delphi 5 et deux problèmes me bloquent dans l'avancement de mon projet :

    Problème 1 :
    Je veux initialiser les variables d'une procédure mais le compilateur ne compile pas ces lignes et plus tard il ne compile pas une autre ligne de mon code :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TCadreResult.Calcul(Sender: TObject);
    var min, Div1, Div2, A : double;
        i,j : integer;
    begin
         Div2 := 0; // non compilé
         Div1 := 0; // non compilé
     
    //  code sans problèmes de compilation
     
         Div1 := Div1 * 1000;  // ligne compilée
         Div2 := Div2 * 1000;  // ligne non compilée
     
    end;
    Si quelqu'un a une solution je suis preneur.


    Problème 2 :
    J'utilise une fonction qui prend un double en paramètre et qui me renvois un double. Pour choisir le double renvoyé j'utilise une structure utilisant des if else if.

    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
    function TCadreResult.Subdivision( SubDiv : double) : double;
    begin
         if (SubDiv = 0.010) then result := 0.006
         else if (SubDiv = 0.016) then result := 0.010
         else if (SubDiv = 0.025) then result := 0.016
         else if (SubDiv = 0.040) then result := 0.025
         else if (SubDiv = 0.063) then result := 0.040
         else if (SubDiv = 0.10)  then result := 0.063
         else if (SubDiv = 0.16)  then result := 0.10
         else if (SubDiv = 0.25)  then result := 0.16
         else if (SubDiv = 0.40)  then result := 0.25
         else if (SubDiv = 0.63)  then result := 0.40
         else if (SubDiv = 1.0)   then result := 0.63
         else if (SubDiv = 1.6)   then result := 1.0
         else if (SubDiv = 2.5)   then result := 1.6
         else if (SubDiv = 4.0)   then result := 2.5;
    end;
    Pas de problème de fonctionnement si SubDiv = 1 ou 4 (donc tout les nombres entiers à mon avis) mais pas dans les autres cas.

    Si quelqu'un peu m'expliquer le problème que j'évite de multiplier SubDiv par 1000 pour en faire un entier et pouvoir utiliser mes if.

    Merci d'avance

    Nyio

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 468
    Points : 24 896
    Points
    24 896
    Par défaut
    Delphi détecte les lignes qui ne pourront jamais être exécuté donc elles ne sont pas compilés !

    1) les affectations à zéro sont ignorés à cause des 2 affectations par division

    2) Problème d'arrondi, vérifie si 4.0 n'est pas égale à 3.99999999999999
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Salut,

    Si tu initialises à zéro et ensuite tu t'étonnes de ne rien obtenir

    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
    procedure TForm1.Calcul(Sender: TObject);
    var
      min, Div1, Div2, A : double;
      i,j : integer;
    begin
      Div2 := 700; // Pas à zéro !!!
      Div1 := 270; // Pas à zéro !!!
     
      Div1 := Div1 * 1000;
      ShowMessage(FloatToStr(Div1));
      Div2 := Div2 * 1000; 
      ShowMessage(FloatToStr(Div2));  
    end;
     
    procedure TForm1.Button4Click(Sender: TObject);
    begin
      Calcul(Sender);
    end;
    Pense aux balises CODE et à indenter ton code !

  4. #4
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    @Salut,

    Si on parle du problème de compilation, sur [D2009], je n'ai aucun problème avec ton code (mise à part que cela donne 0 forcément).

    Pour le reste (décimal) no souci également, si ce que tu envoi est bien en décimale mais pas pris en compte regarde ton decimalespearator si ta pas un souci dessus.


  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 8
    Points : 9
    Points
    9
    Par défaut
    Désolé pour les balises, j'ai oublié je l'avoue.
    Pour le if j'ai vérifié en mode débug et il m'annonce bien 0.4. Je vous met plus de détails de mon code (Il peut y avoir des erreurs car j'ai modifié les noms de variables et de fonction trop parlant, et oui secret professionnel oblige ^^)

    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    // remplissage du comboBox dans TCadreResult.Create
       CB_A.Items.Add('0.010');
       CB_A.Items.Add('0.016');
       CB_A.Items.Add('0.025');
       CB_A.Items.Add('0.040');
       CB_A.Items.Add('0.063');
       CB_A.Items.Add('0.10');
       CB_A.Items.Add('0.16');
       CB_A.Items.Add('0.25');
       CB_A.Items.Add('0.40');
       CB_A.Items.Add('0.63');
       CB_A.Items.Add('1.0');
       CB_A.Items.Add('1.6');
       CB_A.Items.Add('2.5');
       CB_A.Items.Add('4.0');
    //-----------------------------------------------------
     
     
    //------------------------------------------------//
    //---------    Calcul           ------------------//
    //------------------------------------------------//
    procedure TCadreResult.Calcul(Sender: TObject);
    var min, Div1, Div2, A : double;
        i,j : integer;
    begin
    //--- RAZ Tableaux---
         for i := 1 to SGRayure.rowcount-1 do for j := 0 to 20 do SGRayure.Cells[j,i] := '' ;
         for i := 1 to SGPonc.rowcount-1 do for j := 0 to 20 do SGPonc.Cells[j,i] := '' ;
         SGPonc.RowCount := 2 ;
         SGRayure.RowCount := 2 ;
         RemplirLigne(TStringGrid(SGPonc), 1, nil) ;
         RemplirLigne(TStringGrid(SGRayure), 1, nil) ;
    //---Calcul des SubDivisions 
         A := StrToFloat(CB_A.text);  //CB_A est un comboBox avec des valeurs en dur dans le code
         min := 0.16 * A;
         Div1 := Subdivision( A );  // problème des if
         if (Div1 > 0.006) then Div2 := Subdivision( Div1 );  // problème des if
         // passage mm -> micron
         A := A * 1000;
         min := min * 1000;
         Div1 := Div1 * 1000;
         Div2 := Div2 * 1000;   // ligne non compilée
    //---Remplissage du tableau 
         FillGrid(A,min,Div1);
    end;
    //------------------------------------------------//
     
    //------------------------------------------------//
    //---------    Calcul SubDivision       ----------//
    //------------------------------------------------//
    function TCadreResult.Subdivision( SubDiv : double) : double;  
    begin
         if (SubDiv = 0.010) then result := 0.006
         else if (SubDiv = 0.016) then result := 0.010
         else if (SubDiv = 0.025) then result := 0.016
         else if (SubDiv = 0.040) then result := 0.025
         else if (SubDiv = 0.063) then result := 0.040
         else if (SubDiv = 0.10)  then result := 0.063
         else if (SubDiv = 0.16)  then result := 0.10
         else if (SubDiv = 0.25)  then result := 0.16
         else if (SubDiv = 0.40)  then result := 0.25
         else if (SubDiv = 0.63)  then result := 0.40
         else if (SubDiv = 1.0)   then result := 0.63
         else if (SubDiv = 1.6)   then result := 1.0
         else if (SubDiv = 2.5)   then result := 1.6
         else if (SubDiv = 4.0)   then result := 2.5;
    end;
    Pour contourner le problème des if j'ai remplacé ma fonction par celle ci :
    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
     
    //------------------------------------------------//
    //---------    Calcul SubDivision       ----------//
    //------------------------------------------------//
    function TCadreResult.Subdivision( SubDiv : double) : double;
    begin
         SubDiv := SubDiv * 1000;
         if (SubDiv = 10) then result := 0.006
         else if (SubDiv = 16) then result := 0.010
         else if (SubDiv = 25) then result := 0.016
         else if (SubDiv = 40) then result := 0.025
         else if (SubDiv = 63) then result := 0.040
         else if (SubDiv = 100)  then result := 0.063
         else if (SubDiv = 160)  then result := 0.10
         else if (SubDiv = 250)  then result := 0.16
         else if (SubDiv = 400)  then result := 0.25
         else if (SubDiv = 630)  then result := 0.40
         else if (SubDiv = 1000)   then result := 0.63
         else if (SubDiv = 1600)   then result := 1.0
         else if (SubDiv = 2500)   then result := 1.6
         else if (SubDiv = 4000)   then result := 2.5;
    end;
    Aucun problème de fonctionnement avec l'appel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Div1 := Subdivision( A );
    Mais avec l'appel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if (Div1 > 0.006) then Div2 := Subdivision( Div1 );
    on rentre bien dans la fonction, le bon if est utilisé mais la valeur result n'est pas affecté à Div2.

    C'est mon premier programme en Delphi (et même POO sauf quelques mini-programme de java) et j'ai vraiment aucun recul sur les erreurs que j'ai pu faire. Toute idée me sera utile.

    Merci de votre aide.

  6. #6
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Salut

    Je ne crois pas que le fait de multiplier par 1000 dans Subdivision change quelque chose. Il y a une procedure qui permet de vérifier si 2 doubles sont égaux, c'est IsEqual je crois. Vérifie avec l'aide Delphi.
    Tu pourra remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (SubDiv = 0.016) then
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if IsEqual(SubDiv,0.016) then
    Bonne chance.

    PS : a mon avis, ya moyen d'optimiser ca :
    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
    function TCadreResult.Subdivision( SubDiv : double) : double;
    begin
         if (SubDiv = 0.010) then result := 0.006
         else if (SubDiv = 0.016) then result := 0.010
         else if (SubDiv = 0.025) then result := 0.016
         else if (SubDiv = 0.040) then result := 0.025
         else if (SubDiv = 0.063) then result := 0.040
         else if (SubDiv = 0.10)  then result := 0.063
         else if (SubDiv = 0.16)  then result := 0.10
         else if (SubDiv = 0.25)  then result := 0.16
         else if (SubDiv = 0.40)  then result := 0.25
         else if (SubDiv = 0.63)  then result := 0.40
         else if (SubDiv = 1.0)   then result := 0.63
         else if (SubDiv = 1.6)   then result := 1.0
         else if (SubDiv = 2.5)   then result := 1.6
         else if (SubDiv = 4.0)   then result := 2.5;
    end;

  7. #7
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Dans ta procédure Calcul tu déclares 4 variables locales: Min, Div1, Div2 et A.

    Div2 n'étant utilisée nulle part celle-ci est simplement ignorée à la compilation.
    Les deux affectations à Div2 sont éliminées:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      Div2 := Subdivision(Div1);  // problème des if
    // et
      Div2 := Div2 * 1000;   // ligne non compilée
    Contrairement aux variables A, Min et Div1 qui sont utilisées lors de l'appel à FillGrid.

    [edit]
    J'écrirais la fonction Subdivision plutôt comme ceci.
    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
    function Subdivision(const SubDiv: Double): Double;
    var
      Value: Integer;
    begin
      Value := Trunc(SubDiv * 1000);
      case Value of
        10:   Result := 0.006;
        16:   Result := 0.010;
        25:   Result := 0.016;
        40:   Result := 0.025;
        63:   Result := 0.040;
        100:  Result := 0.063;
        160:  Result := 0.10;
        250:  Result := 0.16;
        400:  Result := 0.25;
        630:  Result := 0.40;
        1000: Result := 0.63;
        1600: Result := 1.0;
        2500: Result := 1.6;
        4000: Result := 2.5;
      else
        raise Exception.CreateFmt('Valeur %f inattendue.', [SubDiv]);
      end;
    end;

    @+ Claudius

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 8
    Points : 9
    Points
    9
    Par défaut
    Merci Cl@udius pour l'explication à propos de Div2, en faisant appel à ma future fonction utilisant Div2 tout est rentré dans l'ordre.

    Pour ma fonction SubDivision j'ai utilisé un if car au départ je voulais tester ma valeur sans la multiplication par 1000, donc tester un double. Or on ne peux pas faire de case sur un double.

    Pour régler ce problème soit je reprend la méthode SubDivision comme dans l'exemple de Cl@udius soit j'utilise la methode décrite ici : http://delphi.developpez.com/faq/?pa...comprarerreels

    La multiplication par 1000 me parait plus simple et plus claire donc je vais opter pour celle-ci dans mon code, en gardant la deuxième sous le coude.

    Merci à tous pour votre aide.

    Nyio

  9. #9
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Citation Envoyé par Nyio- Voir le message
    Pour le if j'ai vérifié en mode débug et il m'annonce bien 0.4.
    L'evaluateur arrondi le resultat. Tu a des valeurs additionnelles pour modifier l'affichage (a separer de l'expression par une virgule), comme:
    • fX : pour afficher X decimales
    • r : pour afficher le nom des champs
    • ...

    Par exemple, si tu tapes "Div1" ca t'affiche 0.4; si tu tapes "Div1, f18" ca t'affiche 0.3999999999

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

Discussions similaires

  1. [MySQL] Problème sur un test et afichage conditionnel
    Par runcafre91 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 01/04/2010, 23h09
  2. lignes non compilés
    Par tijani dans le forum Langage
    Réponses: 3
    Dernier message: 25/01/2010, 15h06
  3. Lignes non compilées
    Par defluc dans le forum Langage
    Réponses: 10
    Dernier message: 24/12/2007, 19h26
  4. Problème sur un test de valeur de cellule
    Par nolive915 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 11/04/2007, 13h40
  5. [AS] Problème sur un test If
    Par PrinceMaster77 dans le forum Flash
    Réponses: 2
    Dernier message: 11/01/2006, 11h53

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