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 :

Evaluations des paramètres d'une fonction [FAQ]


Sujet :

Langage Delphi

  1. #1
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut Evaluations des paramètres d'une fonction
    Salut tout le monde,

    comme indiqué ici : http://delphi.developpez.com/faq/?pa...ees#ifimmediat
    je fais un IF immédiat (comme l'opérateur ternaire en C) dont voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function IIF( aCondition : Boolean; aResultVrai, aResultFaux : Integer ) : Integer;
    begin
      if aCondition then
        Result := aResultVrai
      else
        Result := aResultFaux;
    end;
    Puis je l'utilise dans l'exemple ci dessous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     FIndexDsParent := IIF( FObjet = nil, FCount, FObjet.IndexDsGroupeParent );
    Sauf qu'avant de rentrer dans le IIF, Delphi évalue les 3 paramètres, donc la condition et les 2 résultats possibles, et le second créé bien évidement une violation d'accés quand FObjet est nil.

    Dans ce cas précis, il est bien évidement possible de faire avec un simple IF classique, mais j'aurrais voulu savoir s'il n'était pas possible de n'évaluer les paramètres que lorsque ceux ci sont utiles.

    Ce serrait un peu comme quand on fait un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Result := (FObjet <> nil) and (FObjet.ValeurBool);
    qui ne fait pas de violation d'accés car on ne teste la seconde opérande que si la première est True.
    (pour cela décocher Evaluation booléenne complète dans les options du projet ou bien rajouter {$B-} comme instruction pour le préprocesseur).

    Merci pour vos réponses.

  2. #2
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 664
    Points : 6 967
    Points
    6 967
    Par défaut
    Un if immédiat, c'est comme la fonction IfThen ?

    :
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  3. #3
    DMO
    DMO est déconnecté
    Membre averti
    Avatar de DMO
    Profil pro
    Inscrit en
    Février 2004
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 290
    Points : 343
    Points
    343
    Par défaut
    Lung : Parfaitement
    WebPac : Comme Lung te le fait remarquer, tu pouvais utiliser IfThen de Math ou de StrUtils. Mais pour répondre à ta question, j'ai bien peur que ton analyse soit exact et qu'il ne soit pas possible de faire autrement dans le cas que tu soulèves qu'avec un if standard.
    « La simplicité est la sophistication suprême » (Léonard de Vinci)

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Points : 576
    Points
    576
    Par défaut
    Bonjour,


    A ma connaissance non.
    Il y à dailleur une bonne raison à cela.
    Lorsque vpous appeler la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     FIndexDsParent := IIF( FObjet = nil, FCount, FObjet.IndexDsGroupeParent );
    Il n'y à aucun test de fait. Le test est fait plus tard, dans la fonction.

    La seule chose de pratique que je verrait pour vous facilier le travail serai une fonction ou une property resemblant à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    function FObjetIndexDsGroupeParent: Integer;
    begin
      if FObject = nil then
        Result := 0
      else
         Result := FObjet.IndexDsGroupeParent;end;

  5. #5
    Membre habitué
    Inscrit en
    Mars 2003
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Mars 2003
    Messages : 281
    Points : 187
    Points
    187
    Par défaut
    La seule chose de pratique que je verrait pour vous facilier le travail serai une fonction ou une property resemblant à :
    Code:

    function FObjetIndexDsGroupeParent: Integer;
    begin
    if FObject = nil then
    Result := 0
    else
    Result := FObjet.IndexDsGroupeParent;end;
    Comment peux t'on utiliser la propriété d'un objet non instancié ????

    Pour lire la propriété IndexDsGroupeParent il faut que Fobjet existe ?

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Points : 576
    Points
    576
    Par défaut
    A prioris RamDevTeam à surtout un problème de valeur par défaut si l'objet n'est pas instancié.
    La propriété n'est utilisé dans sa procédure que si l'objet est instancié et la valeur FObjet.IndexDsGroupeParent n'est pas utilisé.

  7. #7
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Citation Envoyé par RamDevTeam
    Comment peux t'on utiliser la propriété d'un objet non instancié ????
    En faisant une fonction de classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    class function IIF(...)
    Que tu appelles directement :
    Voila...
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  8. #8
    Membre expérimenté
    Avatar de Bloon
    Homme Profil pro
    Consultant Freelance
    Inscrit en
    Avril 2002
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant Freelance
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2002
    Messages : 467
    Points : 1 339
    Points
    1 339
    Par défaut Re: Evaluations des paramètres d'une fonction
    Citation Envoyé par WebPac
    Dans ce cas précis, il est bien évidement possible de faire avec un simple IF classique, mais j'aurrais voulu savoir s'il n'était pas possible de n'évaluer les paramètres que lorsque ceux ci sont utiles.
    Ca n'est pas possible, quelle valeur serait passée à la fonction alors ?

    Bloon
    A lire : Les règles du club
    Delphi : La FAQ - Articles

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Points : 576
    Points
    576
    Par défaut
    Dans sont cas se n'est pas tres important.
    Cependant si c'est un index (comme le nom le laisse penser) pourqoui pas -1.
    Les index ommence le plus souvent à 0 et - 1 permet de tester si l'index est valable.

  10. #10
    Membre expérimenté
    Avatar de Bloon
    Homme Profil pro
    Consultant Freelance
    Inscrit en
    Avril 2002
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant Freelance
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2002
    Messages : 467
    Points : 1 339
    Points
    1 339
    Par défaut
    Citation Envoyé par Tardiff Jean-François
    Dans sont cas se n'est pas tres important.
    Cependant si c'est un index (comme le nom le laisse penser) pourqoui pas -1.
    Les index ommence le plus souvent à 0 et - 1 permet de tester si l'index est valable.
    Certes... mais le compilateur il faut bien qu'il transmette une valeur s'il n'évalue pas l'argument !

    Bloon
    A lire : Les règles du club
    Delphi : La FAQ - Articles

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Points : 576
    Points
    576
    Par défaut
    C'est pourquoi je proposait une procédure qui renvoi une valeur par défaut si l'objet est inexistant.

  12. #12
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    Héhé, merci pour toutes ces réponses, ca fait plaisir de voir qu'un sujet intousiasme les troupes.

    Lung, oui en effet, la fonction IIF est exactement comme la fonction IfThen, je ne savais pas qu'elle existe merci pour l'info, ensuite ceci soulève une question qui est, pourquoi dans la FAQ on retrouve la fonction IfThen refaite "à la main" ?
    (réponse possible, pour apprendre et parce que tout le monde ne possède pas les sources dans unités).

    RamDevTeam, je pense Tardiff Jean-François a pensé que FObjet était un attribut d'un objets conteneur et on faisait la propriété ce cet objet conteneur qui serrait lui instancié à coup sûr (et non FObjet), mais malheureusement, j'avais voulu faire une function générique qui marcherait pour tous les objets, mais de toute façon vu que cette fonction existe nativement dans Delphi, je vais la supprimer.

    Pedro204, une fonction de classe est la même chose qu'une méthode ou bien est-ce une méthode applicable sur un objet non instancié ?

  13. #13
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Citation Envoyé par WebPac
    Pedro204, une fonction de classe est la même chose qu'une méthode ou bien est-ce une méthode applicable sur un objet non instancié ?
    C'est une méhode que tu appelles de puis la classe... Prends l'exemple de Create:
    Quand tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Form:=TForm.Create(Application);
    TForm n'est pas instancié mais tu peux appeler Create qui est une fonction de classe...
    Un autre exemple:
    Tu as une form que tu veux lancer juste avec Execute...
    au lieu de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      with TFormExec.Create(...) do
      try
        ...
        Execute;
      finally
        Release;
      end;
    Tu peux faire directement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TFormExec.Execute;
    A l'intérieur, il y aura tout le code de crétaiond de la fiche, son initialisation, etc.
    J'espère que mes explications t'ont éclairé
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

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

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

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 559
    Points : 3 949
    Points
    3 949
    Par défaut
    Salut

    Je ne peux m'empêcher de ramener ma fraise sur ce sujet. Je pense que vous avez dépensé bien de l'énergie pour un problème qui n'en est pas vraiment un.

    L'opérateur de sélection du C, comme son nom l'indique, est un opérateur - il manque un peu dans Delphi mais ce n'est pas l'absent le plus regretté - qui est directement supporté par le langage, il ne nécessite donc pas de réécriture à chaque fois que l'on veut l'exploiter pour des types différents (réels...).

    La fonction telle que vous l'avez définie est, je pense, d'une portée assez limitée, son appel entraîne un passage de paramètres, ce n'est pas toujours nécessaire et ne plainde pas dans le sens du temps d'exécution (encore un qui compte ses nanosecondes, allez-vous me dire). Quant à définir un objet rien que pour ça, je pense que c'est un peu excessif.
    Réservons plutôt les objets pour les abstractions "nécessiteuses".

    cdlt

    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."

  15. #15
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    Salut,

    Pedro204, non désolé, j'ai pas trop suivi mais je lirai de la doc dessus quand j'aurrai besoin de savoir comment ca fonctionne.

    e-ric, l'utilité d'une telle chose serait exemple de ne pas faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if FObjet = nil then
      GrosseMethode(......, FCount, .....)
    else
      GrosseMethode(......, FObjet.GetValeur, .......);
    Le code important est la méthode et non le test sur l'instanciation ou non de FOjet, donc que le code retranscrive ceci.

    Tu regardes l'importance de faire un code optimisé (ce qui est relativement important dans les cas critiques, perso je suis aussi un tracacé de faire un code qui ne fait pas bcp de boucles inutiles) et c'est exact mais il existe aussi un autre point fort important en programmation,
    celui de la reprise de code, il faut qu'il soit compréhensif et que les instructions importantes soient mises en valeur par rapport à celles secondaires (entre autre), et l'opérateur ternaire pourrait dans ce cas nous aider dans cette tache.

    Je vais arrêter la car je vois que tu aimes bien faire des débats de troll et ce sujet n'était pas destiné à ceci mais bien à voir s'il existait un moyen pour refaire cet opérateur ternaire.

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

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

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 559
    Points : 3 949
    Points
    3 949
    Par défaut
    Citation Envoyé par WebPac
    Tu regardes l'importance de faire un code optimisé (ce qui est relativement important dans les cas critiques, perso je suis aussi un tracacé de faire un code qui ne fait pas bcp de boucles inutiles) et c'est exact mais il existe aussi un autre point fort important en programmation,
    celui de la reprise de code, il faut qu'il soit compréhensif et que les instructions importantes soient mises en valeur par rapport à celles secondaires (entre autre), et l'opérateur ternaire pourrait dans ce cas nous aider dans cette tache.

    Je vais arrêter la car je vois que tu aimes bien faire des débats de troll et ce sujet n'était pas destiné à ceci mais bien à voir s'il existait un moyen pour refaire cet opérateur ternaire.
    Pour la reprise du code, je suis vacciné, cela fait 6 ans que je travaille sur des maintenances dans des conditions un peu limites, et j'estime que ce n'est ce genre de routine que l'on gagne en maintenabilité.

    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."

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

Discussions similaires

  1. [PHP 5.3] Typage des paramètres d'une fonction pour ou contre
    Par berceker united dans le forum Langage
    Réponses: 6
    Dernier message: 09/07/2009, 15h34
  2. Réponses: 1
    Dernier message: 27/11/2008, 10h55
  3. Réponses: 2
    Dernier message: 28/04/2008, 20h04
  4. Réponses: 3
    Dernier message: 16/05/2007, 10h03
  5. Réponses: 3
    Dernier message: 14/05/2007, 15h24

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