DenisHen Posté(e) le 17 avril 2019 Posté(e) le 17 avril 2019 Bonjour à tous. Voilà, j'ai plusieurs LISP (routines) qui font souvent appel à d'autres (sous-routines). Mon souci est que lors de la sortie de la sous-routine, son résultat s'écrit en ligne de commande. Le plus gros problème est que ça n'arrive pas toujours et je ne sais pas pourquoi... Voici un exemple qui fonctionne bien :(defun c:testRoutine (/) (Princ (strcat "Résultat=" (rtos (TestSousRoutine 20) 2 2))) (princ) ) (defun TestSousRoutine (Var /) (setq Var (+ Var 20)) ) Ce qui me donne ce que je cherche :Commande: TESTROUTINE Résultat=40.00Commande:Mais dans d'autres routines et sous-routines, ça donne ça :Commande: TESTROUTINE 40 Résultat=40.00Commande:On voit le résultat de la sous-routine (40) avant le (princ de la routine (Résultat=40.00). je ne sais pas si je me suis bien fais comprendre... Windows 11 / AutoCAD 2024 Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net). Davantage d'avantages, avantagent davantage (Bobby Lapointe). La connaissance s'accroît quand on la partage (Socrate). Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)
lecrabe Posté(e) le 17 avril 2019 Posté(e) le 17 avril 2019 Hello Reponse d une Truffe en Lisp ! Ca ne serait pas un probl du genre : (setvar "cmdecho" 0) Bye, lecrabe Autodesk Expert Elite Team
DenisHen Posté(e) le 17 avril 2019 Auteur Posté(e) le 17 avril 2019 Salut. Je ne pense pas, car sans changer cette variable, les résultats sont différents... Mais je vais tester... ... ... Ben non, ça ne change rien... Merci pour ton aide... Windows 11 / AutoCAD 2024 Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net). Davantage d'avantages, avantagent davantage (Bobby Lapointe). La connaissance s'accroît quand on la partage (Socrate). Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)
didier Posté(e) le 17 avril 2019 Posté(e) le 17 avril 2019 Coucou On ne sait pas ce que tu veux obtenir ??Si tu ne veux rien (j'imagine que c'est une possibilité tu ne le dis pas) essaie en mettant un (princ) en dernière ligne de ton lisp Éternel débutant... Mon site perso : Programmer dans AutoCAD
(gile) Posté(e) le 17 avril 2019 Posté(e) le 17 avril 2019 Salut, Si tu montres un exemple qui fonctionne comme tu le souhaites mais que n'en montre aucun qui ne fonctionne pas, ça va être très difficile de t'aider... Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
rebcao Posté(e) le 18 avril 2019 Posté(e) le 18 avril 2019 Bonjour,Voila la réponse d'un autre champignon… d'Alsace, celui là ! Je pense que le 2e affichage se produit à l'appel de la fonction : (TestSousRoutine)Si tu ajoutes un (PRINC) à la fin, ça sans doute faire disparaitre l'écho ! Non ? (defun TestSousRoutine (Var /)<br style="color: rgb(0, 0, 0);"> (setq Var (+ Var 20)) (princ)) Christian Formateur, Consultant Expert AutoCAD, REVIT MEP, INVENTOR, télécharger , des Outils AutoCAD...cad123 @ wanadoo.fr (enlever les espaces de part et d'autre de @)
(gile) Posté(e) le 18 avril 2019 Posté(e) le 18 avril 2019 À didier et rebcao, Le (princ) à la fin de la fin de TestSousRoutine serait la dernière expression évaluée, donc la valeur renvoyée par TestSousRoutine, un symbole vide dans ce cas, et TestRoutine aurait généré une erreur à l'évaluation de :(rtos (TestSousRoutine 20) 2 2)qui serait équivalent à:(rtos (princ) 2 2) Si on comprends bien, ce que cherche à faire DenisHen c'est récupérer le résultat de l'évaluation de (+ var 20). Pour enlever toute confusion, sa routine aurait dû s'écrire simplement :(defun TestSousRoutine (Var /) (+ Var 20) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
DenisHen Posté(e) le 18 avril 2019 Auteur Posté(e) le 18 avril 2019 Salut à tous, et merci pour votre aide. Effectivement, je ne pouvais mettre un (princ) à la fin de la sous-routine. Mais avec l'explication de Maître (gile), je comprend maintenant que c'est la dernière évaluation de cette sous-routine qui est la valeur récupérée par la routine. J'ai donc réécris cette sous-routine dans ce sens. Désolé pour l'explication un peu floue... Encore merci à vous. Denis... Windows 11 / AutoCAD 2024 Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net). Davantage d'avantages, avantagent davantage (Bobby Lapointe). La connaissance s'accroît quand on la partage (Socrate). Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)
(gile) Posté(e) le 18 avril 2019 Posté(e) le 18 avril 2019 Pour résumer, ne jamais perdre de vue qu'une routine LISP retourne toujours une valeur, fusse-t-elle nil ou un symbole vide (invisible dans ce cas). Mais ne pas oublier non plus que certaines fonctions ont aussi un effet de bord.(princ 20) renvoie bien 20 mais après avoir inscrit 20 sur la ligne de commande. Un exemple qui reproduit ce que tu décris:(defun c:commande (/ resultat) (setq resultat (routine1 10)) (princ (strcat "Resultat 1 = " (rtos resultat 2 2))) (terpri) (setq resultat (routine2 20)) (princ (strcat "Resultat 2 = " (rtos resultat 2 2))) (princ) ) (defun routine1 (arg) (+ 20 arg) ) (defun routine2 (arg) (princ (+ 20 arg)) ; <- inscrit "20" et renvoie 20 ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
DenisHen Posté(e) le 18 avril 2019 Auteur Posté(e) le 18 avril 2019 Merci (gile) pour cette précision... (terpri) ? ? ? Connaissais pô... Windows 11 / AutoCAD 2024 Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net). Davantage d'avantages, avantagent davantage (Bobby Lapointe). La connaissance s'accroît quand on la partage (Socrate). Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)
Messages recommandés
Créer un compte ou se connecter pour commenter
Vous devez être membre afin de pouvoir déposer un commentaire
Créer un compte
Créez un compte sur notre communauté. C’est facile !
Créer un nouveau compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant