Aller au contenu

Erreur de routine besoin d'aide


CadFrank

Messages recommandés

Bonjour,

 

Je suis entrein de lire une livre sur AutoLisp.

 

Et il arrive des fois qu'il donne des example de petite routine pour qu'on se pratique un peu.

 

Par contre je fait cette routine de A à Z :

 

(defun c: spirale(/ PT R NC N Centre)

 (setq PT (getpoint "\nPoint de départ: "))
 (setq R (getdist PT "\nRayon de départ: "))
 (setq NC (getint "\nNombre de cycle? : "))
 (if(> NC 2)
   (progn
     (setq N 1)
     (Setq Centre (polar PT pi R))
     (Tracer PT CE N)
   );progn
 );if
);defun c:


(defun Tracer(/ P1 CE N)
 (if (/= N NC)
   (progn
     (if (= (rem N 2) 0) (setq AN 0) (setq AN pi))
     (command "_arc" P1 "_c" CE "_a" 180)
     (setq CE P1)
     (setq N(1+ N))
     (setq P1 (polar P1 AN (* 2 R)))
     (setq R (* 2 R))
     (Tracer P1 CE N)
   );progn
 );if
(princ)
);defun

 

J'ai tout essayer et vu je connais pas encore l'interface Vlisp je sais pas comment le debuger.

 

il me retourne l'erreur qui suit.

 

; error: bad DEFUN syntax: (C: SPIRALE (/ PT R NC N CENTRE) (SETQ PT (GETPOINT "\nPoint de départ: ")) (SETQ R (GETDIST PT "\nRayon de départ: ")) (SETQ NC (GETINT "\nNombre de cycle? : ")) (IF (> NC 2) (PROGN (SETQ N 1) (SETQ CENTRE (POLAR PT PI R)) (TRACER PT CE N))))

 

Aucune idee c'est quoi qui veux dire.. il peut pas etre plus claire se logiciel :blink:

 

Merci pour votre aide.

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Difficile de se lancer dans la programmation sans connaître un peu d'anglais :

error: bad DEFUN syntax

veut dire, en français : "erreur : mauvaise syntaxe de DEFUN".

(defun sym ([arguments...] [/ variables...]) expr...)

 

La fonction defun requiert :

  • un premier argument de type symbole (le nom de la fonction définie) ;
  • puis une liste contenant les arguments (optionnels) et, derrière une barre oblique (slash), les variables locales (optionnelles) ;
  • et enfin, les expressions que la fonction devra exécuter.

Si tu regardes attentivement la première ligne du code que tu as copié :

(defun c: spirale(/ PT R NC N Centre)

On y voit la fonction defun, un premier argument de type symbole : c:, un second argument de type symbole : spirale puis la liste des variables locales (pas d'arguments pour la fonction ici).

Par rapport à la signature de la fonction defun, il y a un argument de type symbole en trop. En fait, une espace (oui, on dit bien une espace en typo) s'est glissée entre c: et spirale.

Cette erreur aurait dû être facilement localisé car j'imagine qu'il est dit dans ce livre qu'on préfixe le nom de la fonction définie avec c: pour que cette fonction puisse être appelée comme une commande AutoCAD.

Il faut donc corriger :

(defun c:spirale(/ PT R NC N Centre)

 

J'ose espérer que l'auteur de ce livre à volontairement laissé quelques erreurs (j'en vois au moins une autre dans le code que tu as posté) pour donner des exercices à ses lecteurs...

 

Ne jamais perdre de vue que du code s'adresse à une machine qui est bien incapable d'interpréter une syntaxe ou une orthographe hasardeuse.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Toujour moi, autre petite question. Quand j'ai pris ma formation sur Autolisp mon professeur me disais de mettre les sub-routine avant le defun c:

 

Et dans le livre il me mettre la sous routine apres.

 

y a-t-il une différence ?

 

Maintenant quand je charge la routine on me retourne

 

; 2 forms loaded from #<editor "L:/ECHAFAUDAGES/RÉFÉRENCES/BIBLIOTHÈQUE TECHNIQUE/AUTOCAD/ROUTINE LISP/spirale.lsp">

 

ce qui veux dire qu'il y a 2 formes chargé a partir de

 

par contre si je lance le program

 

 

apres avoir entré le nombre de cycle. On me retourne

 

; error: too many arguments

 

donc , erreur trop d'argument.

Lien vers le commentaire
Partager sur d’autres sites

j'ai remarqué que si je change tracer pour trace il me donne plus d'erreur

 

Si, tu as une erreur (qui n'a rien à voir avec tracer ou trace) :

; error: too many arguments

qui veut dire : "erreur: trop d'arguments"

 

Ton bouquin ne t'explique donc rien en dehors d'exemples contenant des erreurs ?

 

À mon avis, cet exemple veut montrer comment on appelle une fonction (la fonction tracer) depuis une autre (la fonction c:spirale) en lui passant des valeurs à l'aide d'arguments.

 

Je te conseille la lecture de ce sujet (au moins jusqu'à la réponse #4 pour commencer) ainsi que les autres sujets mis en tête du forum Débuter en LISP.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Gile,

 

J'ai commencer a lire le sujet dont tu me parle et je croit bien que c'est le type d'information que j'ai besoin pour m'instruire sur le LISP.

 

Ton bouquin ne t'explique donc rien en dehors d'exemples contenant des erreurs ?

 

Pour répondre a ceci non le bouquin n'explique rien sur les erreurs.

 

Il donne plus de l'info sur les fonctions + des petites routines avec les fonctions inclu.

 

Par contre je croit que en prennant le temps de lire quelque sujet sur ce site je réussirai a apprend bien vite.

 

 

Merci encore te ton aide précieux.

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Gile,

 

Finalement j'ai trouver l'erreur de mon code, ce qui se trouve entre parenthèse apres le defun ne sont pas des variables locales mais des arguments.

 

j'ai quand même une question je comprend la différence entre une variable locale et une variable globale. Par contre, ce que me tracasse le plus est le quand es-ce que dans ma routine je decide quel est locale ou globale.

 

Salutation et remerciment !

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

ce que me tracasse le plus est le quand es-ce que dans ma routine je decide quel est locale ou globale.

Dommage que je n’ai vraiment pas une minute à moi en ce moment pour fournir une réponse très détaillé, donc faute d’un long discourt je vais essayer de te donner un exemple qui te donnera peut être un élément de réponse…

 

Dans ta console Visual Lisp ou sur ta ligne de commande AutoCAD tape par exemple l’instruction suivante :

(setq CE '(10.0 10.0 10.0))

 

Et maintenant relance ta commande spirale tu devrais voir une des manifestations de la problématique que tu te poses..

 

Cordialement

Apprendre => Prendre => Rendre

Lien vers le commentaire
Partager sur d’autres sites

Merci pour ta réponse, quoi que je ne suis pas plus le comment choisir locale ou globale. c'est p-e moi qui pige pas le LISP comme il le faut.

 

La seule chose que j'ai remarqué c'est que la commande spirale divague un peu et aboutti a une erreur apres avoir tourné en ronde sans comprendre pourquoi elle s'arrete

 

Salutations!

Lien vers le commentaire
Partager sur d’autres sites

Dans ce message qur je t'avais recommandé, il me semble avoir expliqué clairement, et avec des exemples, les différences entre variables globales et locales et l'intérêt qu'il y a, la plupart du temps, à déclarer localement les variables.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Désolé, c'est peut-etre moi qui lit mal ou bien qui interpret mal se que tu veux explique. Si ce n'est pas trop demander aurait tu une autre facon de l'expliquer? sinon ce n'est pas trop grave je vais essayer de relire jusqu'a ce que sa me rentre dans la tete

 

merci beaucoup pour ton aide elle est tres apprécié..

 

mes sincère salutations!

Lien vers le commentaire
Partager sur d’autres sites

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité