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 :

function boolean --> logique delphi douteuse ?


Sujet :

Delphi

  1. #21
    Membre averti
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 68
    Par défaut
    Citation Envoyé par edam
    a prut prés :
    alors si une et une seul est faux pas la pein d'executé le réste est sa c'est une point fort en delphi (bravo à borland pour son travail d'optimisation en delphi) ,,,
    Justement non, ça me pose problème ça.
    Si la fonction fait un traitement local qui n'influe pas sur le reste ok, mais si ce n'est pas le cas, le compilateur n'a pas à ignorer ta fonction...
    Au contraire, je trouve que Borland a fait preuve de légèreté en choisissant un tel comportement...

    si tu as besoin simplement de savoir si au moins de tes fonction retourne vrait utlise plutot (OR)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function DoAllTasks: boolean;
    begin
      result:= false;
      result:= result or DoTask1;
      result:= result or DoTask2;
      ...
    end;
    Oui mais là pareil, si la première fonction renvoie vrai alors les autres ne sont plus exécutées !

  2. #22
    Membre averti
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 68
    Par défaut
    Citation Envoyé par slimjoe
    Bizarre ? Non. Un peu dommage ? Probablement.

    Le problème vient du fait que Delphi n'optimise sur une aussi longue portée qu'on le voudrait parfois.

    Dans le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    var
      s: string;
    begin
      s := 'Test';
    end;
    La ligne s := 'Test'; n'est pas compilée par Delphi. Toutefois, si tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    var
      s1, s2: string;
    begin
      s1 := 'Test';
      s2 := s1;
    end;
    La ligne s := 'Test'; va être compilée. Delphi ne va pas plus loin que la première ligne quand vient le temps d'optimiser.

    C'est probablement ce qu'il se passe avec ton cas #2 de tests booléens.


    [EDIT] Bon... Quand ça va bien.... Je viens de tester mon code et ça compile tout partout... Pourtant j'aurais juré.... Veuillez ignorer ce post alors....
    Ca m'étonne vraiment que le niveau d'optimisation de delphi se cantonne 1 ligne pour ce genre de dépendance, c'est vraiment faible. J'entend souvent que Delphi optimise bien le code, ça serait étonnant en partant ainsi...

    Edit: t'as activé les optimisations ? ^^
    Bizarre quand même...

  3. #23
    Membre Expert Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Par défaut
    Citation Envoyé par Stef_D
    Oui mais là pareil, la première fonction renvoie vrai, les autres ne sont plus exécutées !
    oui c'est vrait
    alors pourqoi pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function DoAllTasks: boolean;
    var  i:integer;
    begin
      i:=0;
      if DoTask1 then inc(i);
      if DoTask2 then inc(i);
    ....
      if DoTaskn then inc(i);
       result:=(i=n);
    end;

  4. #24
    Membre émérite Avatar de slimjoe
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2005
    Messages : 647
    Par défaut
    Citation Envoyé par Stef_D
    Edit: t'as activé les optimisations ? ^^
    Bizarre quand même...
    Je dois avoir un problème avec les optimisations sur mon poste effectivement. J'ai déjà donné cet exemple (et je l'avais testé à l'époque) et ça fonctionnait. Je compte retester une fois à la maison.

  5. #25
    Membre averti
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 68
    Par défaut
    Citation Envoyé par e-ric
    Les choix d'optimisation ne sont pas criticables en soi, on est bien contents de les trouver. Un langage de programmation n'est pas un discours mathématiques, il y a des considérations d'efficacité et de faisabilité. Le concepteur du langage fait des choix. Il faut s'en tenir à cela.

    C'est au développeur de connaître ces particularités. C'est son boulot. Je ne suis pas sûr que les compilateurs C ou C++ fassent tant de miracles que cela. Personnellement, je préfère Delphi car la sémantique est plus simple et le contrôle des types plus musclé, en outre, il compile très vite (on peut accroître la fréquence des tests)

    Enfin, il est envisable de ne pas exécuter la suite d'un traitement si l'une des parties du traitement a échoué (c'est même le plus courant). En ce qui concerne ta fonction, si elle retourne False, on sait qu'une partie a échoué mais on ne sait pas déterminer laquelle (sauf si des indications sont fournies par les DoTaskN). Si les traitements sont dépendants, l'erreur d'une tâche peut avoir des conséquences sur les suivantes.

    Cdlt

    e-ric
    Personnellement je trouve que si justement, les choix d'optimisation sont criticables, justement dans ce cas précis. Je demande pas de supprimer les optimisations, mais juste de les faire intelligement.
    C'est une question de choix... Pour moi le compilateur doit faire ce que tu lui demandes en gardant une cohérence sur le traitement de l'information.
    J'aime le Delphi pour sa simplicité et son efficacité mais je préfère le C++ qui offre plus de liberté et me semble plus rigoureux quand aux optimisations...

    Après tu dis c'est au développeur de connaitre les particularités du langage. Certes, mais il est impossible de tout connaitre le fonctionnement interne du compilo, là c'est un cas simple, mais y'a des cas très complexes qui te prendrait un temps dingue à analyser, surtout que l'aide du delphi est assez radin sur ce genre d'info. Par exemple j'ai pas mal galéré pour comprendre ce que faisait Delphi quand tu lui passais un 'record' en paramètre, ou pire, lorsqu'une fonction retourne un record (Garbage Collector pour le libérer ?) !

    Sinon concernant le traitement qui doit s'interrompre si une erreur intervient, oui c'est souvent le cas, mais le compilateur doit le faire uniquement si tu lui demandes :
    if (DoTask1) then
    if (DoTask2) then...

  6. #26
    Membre émérite Avatar de slimjoe
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2005
    Messages : 647
    Par défaut
    Citation Envoyé par Stef_D
    Je trouve que si justement, les choix d'optimisation sont criticables
    En fait, tout dans la vie peut être sujet à la critique .

    Mais personellement, je pense que dans le cas présent c'est un peu futile. Je suis d'accord avec Stef_D, y'a des choses décevantes qui se passent dans l'environnement Delphi mais je rejoins également e-ric sur ce point : le travail du programmeur est de connaître à fond les outils (les forces autant que les faiblesses) de façon à être en mesure de choisir le bon dépendemment de la situation.

    À moins qu'on se porte acquéreurs de l'EDI.
    Intéressé ?

  7. #27
    Membre Expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 568
    Par défaut
    C'est une question de sensibilité !

    En ce qui concerne la règle d'optimisation sur les évaluations booléennes, elle est claire (je l'ai mentionnée plus haut) et invariable, le développeur Delphi doit l'avoir à l'esprit et faire son code en conséquence. De même, l'analyse du comportement d'un programme se fait à l'aune de cette connaisance. Pas d'expertise sinon. Tous les langages ont leur propres règles, c'est comme çà.

    Tout cela me rappelle un collègue et très bon copain par ailleurs qui n'arrêtait pas de critiquer Delphi par dépit de ne pouvoir programmer en langage C/C++ (ses petits favoris).

    Delphi n'est certes pas parfait (quel langage l'est ??), je lui reproche bien des choses comme :
    - les faiblesses du modèle objet (pas de type générique, pas d'héritage multiple, uniquement une sémantique de référence et j'en oublie)
    - l'impossibilité de déboguer sereinement si l'optimisation est activée.
    - ...
    Mais bon cela ne m'empêche pas d'apprécier ce compilo rapide et robuste.

    e-ric

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  8. #28
    Membre Expert Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Par défaut

  9. #29
    Membre Expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 568
    Par défaut
    Citation Envoyé par edam
    avec {$B}. active tuas pas essayé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    result:=DoTask1 and DoTask2 and ...and DoTaskn;
    J'ai déjà proposé la solution !!!

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  10. #30
    Membre averti
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 68
    Par défaut
    Il est vrai que le débat est un peu futile...
    Parfois en regardant mes lignes de code je me dis "bon après tout..." et d'autres fois où vraiment j'arrive pas à me mettre dans cette logique...

    Le plus choquant restant cet exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    function DoAllTasks: boolean;
    begin
      result:= DoTask1;
      result:= result and DoTask2;
      ...
    end;
    qui produit un résultat différent de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    function DoAllTasks: boolean;
    var
      b: boolean;
    begin
      result:= DoTask1;
      b:= DoTask2;
      result:= result and b;
      ...
    end;
    ... enfin

    Edit :

    Concernant ça :

    En ce qui concerne la règle d'optimisation sur les évaluations booléennes, elle est claire (je l'ai mentionnée plus haut) et invariable
    Si ton expression booléenne contient un variant (même s'il est de type varBool), alors l'expression sera évaluée en entière quoiqu'il arrive... c'est un détail mais qu'il doit être source de belles erreurs parfois

  11. #31
    Membre Expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 568
    Par défaut
    je reconnais c'est curieux.

    Bon WE, nous nous sommes bien amusés quand même...

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  12. #32
    Membre averti
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 68
    Par défaut
    Citation Envoyé par e-ric
    je reconnais c'est curieux.

    Bon WE, nous nous sommes bien amusés quand même...
    En effet... bon WE

Discussions similaires

  1. [function][delphi]problème valeur de retour
    Par daheda dans le forum Delphi
    Réponses: 2
    Dernier message: 14/11/2006, 13h26
  2. Traduction C++/Delphi DLL et function Callback
    Par Crafton dans le forum Langage
    Réponses: 12
    Dernier message: 23/02/2006, 09h55
  3. Réponses: 2
    Dernier message: 17/10/2005, 12h45
  4. function extract du sql et delphi
    Par guy kadima dans le forum Bases de données
    Réponses: 3
    Dernier message: 06/06/2005, 10h08
  5. [Recursivite] function/procedure d'une suite logique
    Par Tata dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 02/03/2005, 16h13

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