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 :

Lignes non compilées


Sujet :

Langage Delphi

  1. #1
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut Lignes non compilées
    Bonjour

    Ma source comporte les instructions suivantes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    X5 := Xi[1]; Y5 := Xi[2];
    if PointOnSegment(X1, Y1, X2, Y2, X5,Y5) then
       begin
         X2 := X5;
         Y2 := Y5;
       end;
    X5 := Xi[3]; Y5 := Xi[4];
    if PointOnSegment(X1, Y1, X2, Y2, X5,Y5) then
       begin
         X2 := X5;
         Y2 := Y5;
       end;
    Le premier test (if) est exécuté alors que le second ne l'est pas et je constate que les lignes ne sont par "marquées" comme compilées pour le second test alors qu'elles le sont pour le premier.

    Quelqu'un aurait-il une explication à cette bizarrerie ?

    Merco d'avance

  2. #2
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Utilises-tu réellement les variables X2 et Y2 après ce if. Si ce n'est pas le cas, il s'agit probablement d'une optimisation du compilateur, qui s'en est rendu compte.

    Sinon, désactive quand même les optimisations et recompile, histoire de voir si ça change quelque chose

  3. #3
    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
    parce que tu compiles avec l'optimisation (projet=>options=>compilateur)

    tes variables ne sont pas utilisées par la suite, donc l'affectation ne sert a rien (selon le compilateur, et il y a peu de chances qu'il se trompe).

    En plus, tu dois avoir un message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [Conseil] MonFichier.pas(1353): La valeur affectée à 'X2' n'est jamais utilisée

  4. #4
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut
    Bizarre, comme ceci, ça marche :
    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
    X5 := Xi[1]; Y5 := Xi[2];
    if PointOnSegment(X1, Y1, X2, Y2, X5,Y5) then
       begin
         X2 := X5;
         Y2 := Y5;
       end
                                                              else
      begin
        X5 := Xi[3]; Y5 := Xi[4];
        if PointOnSegment(X1, Y1, X2, Y2, X5,Y5) then
          begin
           X2 := X5;
           Y2 := Y5;
         end;
      end;

  5. #5
    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
    sans le code complet (la fonction), on ne pourra pas t'aider plus.
    - On ne sait pas d'où sortent X1, X2, ...
    - On ne sait pas ce que tu en fait après
    - ...

  6. #6
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut
    Voici la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Function PointOnSegment(X1, Y1, X2, Y2, X3,Y3 : Double) : Boolean;
    Var
      A: Double;
    begin
    A :=  (X3-X1)/(X2-X1);
    if Not((A<0) or (A > 1)) then Result := True // Le point X3/Y3 est sur le segment
                             else result := False;
    end;

  7. #7
    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
    ce n'est pas cette fonction dont je voulais parler, c'est la fonction qui entoure le boute de code que tu nous a mis dans ton premier message (la ou sont déclarés X1, ..., X5 normalement), a moins qu'elles en soient globales (ce qui m'étonnerai vu le comportement du compilateur).

    Petite remarque sur ton code :
    pour moi, ta fonction vérifie simplement que X3 est compris entre X1 et X2 inclus (avec X1 inférieur ou égal à X2)!!!

    pourquoi ne pas tout simplement utiliser ce code (en enlevant les parametres inutiles):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Function PointOnSegment(X1, X2, X3 : Double) : Boolean;
    begin
      Result := (X1 <= X3) and (X3 <= X2);
    end;
    ?

  8. #8
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut
    T'as raison, pour ce qui est du passage de paramètres inutiles. Mon application utilise des équations compliquées qui m'ont rendu aveugle par rapport aux choses simples.
    Par contre, ton code ne donne pas le même résultat que le mien.

  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
    dis moi si je me trompe:
    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
    1 - La condition (NB: "-" = "not"):
       -(  (A <  0)  or  (A >  1) )
    <=> ( -(A <  0) -or -(A >  1) )
    <=> ( -(A <  0) and -(A >  1) )
    <=>    (A >= 0) and  (A <= 1) 
    
    
    2 - L'equation :
    Soit A = (X3-X1)/(X2-X1)
    
    
    • cas A >= 0 : (X3-X1)/(X2-X1) >= 0 (X3-X1) >= 0 X3 >= X1
    • cas A <= 1 : (X3-X1)/(X2-X1) <= 1 (X3-X1) <= (X2-X1) X3 <= X2
    3 - fusion des 2 resultats : (A >= 0) and (A <= 1) <=> (X3 >= X1) and (X3 <= X2) <=> X1 <= X3 <= X2

  10. #10
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut
    Les deux algo donnent le même résultat avec
    X1 = 8, X2 = 14 et X3 = tantôt 10, tantôt 16.
    Mais avec des données moins simplistes (X1 = 149274.97473, X2 = 149193.22473, X3 = 149233.21235), j'ai des résultats différents.

    Chapeau en tout cas pour le développement booléen.

  11. #11
    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
    effectivement, mon calcul n'est pas bon, le signe de l'inégalité dépend du signe des opérandes

    je te propose donc la solution suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
      Result := (A >= 0) and (A <= 1);
    ...

Discussions similaires

  1. Réponses: 8
    Dernier message: 30/06/2010, 14h06
  2. lignes non compilés
    Par tijani dans le forum Langage
    Réponses: 3
    Dernier message: 25/01/2010, 15h06
  3. retour a la ligne non voulu dans mes tableaux ????
    Par cedre22 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 01/03/2006, 15h48
  4. Ligne de compilation
    Par rod59 dans le forum OpenGL
    Réponses: 8
    Dernier message: 27/02/2006, 10h45
  5. Lecture de fichier - dernière ligne non prise en compte
    Par JulienPles dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 16/03/2005, 11h57

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