Aller au contenu

Petit problème de type de variable


Messages recommandés

Posté(e)

Bonjour à tous.

 

Voilà, je fais évoluer ma routine de "Cotation XYZ". Je demande à l'utilisateur le nombre de saisies manuelles qu'il va effectuer. Poue ce faire, j'ai une variable qui comporte sa réponse :

  (initget 1 "Aucune 1 2 3 4 5 6 7 8 9 inconnu")
 (setq SaisiTxtAv
   (getstring
   "\nCombien de ligne y-at'il à saisir avant les coordonnées [Aucune/1/2/3/4/5/6/7/8/9/Inconnu] : "
   ) ;_ Fin de getstring
 ) ;_ Fin de setq

 

J'ai donc dans ma variable SaisiTxtAv un string. J'aimerai, plus loin dans ma routine, savoir si elle contient un nombre ou un string, j'ai donc fais ça :

      (if (= (type (setq NbTxtAv (atoi NbTxtAv))) INT)
       (while (> NbTxtAv 0)
                (setq TextAv (inputbox "DenisH" "Tapez le ligne :" ""))
                (setq Text (strcat Text "//P" TextAv))
                (setq NbTxtAv (- NbTxtAv 1))
              ) ;_ Fin de while
     ) ;_ Fin de if

 

Mais je suis sûr que c'est mon (setq NbTxtAv (atoi NbTxtAv)) qui plante. Car ça plante.

 

Je ne sais pas trop comment faire pour attribuer un integer à NbTxtAv (1, 2, 3...) seulement si celui-ci est un string comportant un integer ("1", "2", "3"...) et ne pas faire d'erreur si NbTxtAv = "Aucun" ou "Inconnu"...

 

Si quelqu'un a une idée, un conseil... Je suis preneur...

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)

Posté(e)

Hello,

tu devrais te pencher sur initget et tester la réponse avec (= rep "Aucune") et (= rep "Inconnu")

(initget "Aucune Inconnu")
(setq rep(getint "Valeur [Aucune/1/2/3/4/5/6/7/8/9/Inconnu]"))

A et I deviennent des valeurs autorisées ainsi que les chiffres.

Mais, actuellement, je peux aussi répondre 9999

 

Pour ton erreur de test atoi crée forcément un INT donc tu obtiens toujours T !

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Posté(e)

Plus radical :

(initget "Aucune Inconnu 1 2 3 4 5 6 7 8 9")
(setq rep(getkword "Valeur [Aucune/1/2/3/4/5/6/7/8/9/Inconnu]"))

Purement et simplement.

Et là, le atoi devra être placé judicieusement après que rep ait été testé.

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Posté(e)

Coucou

 

Puisque tu attends un integer c'est simple

Demande directement un integer en posant la question ...

Au lieu de :

(getstring "\nCombien de ligne y-at'il à sa ...

 

(getint "\nCombien de ligne y-at'il à sa ...

 

Si l'utilisateur ne répond pas un entier lors de sa saisie une boucle se forme automatiquement en attendant un entier.

 

Ah !! DenisH et sa réticence à regarder l'aide en ligne, c'est quelque chose !!!

Amicalement

Posté(e)

Salut Tramber...

 

Très instructif... Et mille merci pour tes deux réponses... Je pense choisir la deuxième et la traiter avec un cond, de ce genre :

(cond ((= Rep "Aucun")
...
)
((= Rep "Inconnu")
...
)
(((and (/= Rep "Aucun") (/= Rep "Inconnu"))
(setq valeur (atoi Rep))
...
)

 

Et encore merci...

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)

Posté(e)

Bonjour didier...

 

J'ai jeté un coup d'oeil à l'aide, mais je n'ai pas trouvé les deux astuces de Tramber... ;)

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)

Posté(e)

Salut,

 

Première chose : choisir la bonne fonction.

Ce que tu veux, c'est que l'utilisateur choisisse une option parmi celles proposées, autrement dit : un "mot clé" (keyword en anglais) donc, utilise getkword.

Avec getstring l'utilisateur peut entrer n'importe quelle chaîne et avec getint, il pourra entrer n'importe quel entier.

 

Ensuite fais attention à la casse dans le initget : si tu ne mets aucune lettre en majuscule dans un mot clé, il faudra l'entrer en entier.

 

Pour finir, comme getkword assure que l'utilisateur n'a pu entrer qu'un des mots clé spécifier, tu peut utiliser la fonction cond pour traiter le résultat qui sera :

- soit égal à "Aucune" ;

- soit égal à "Inconnu" ;

- soit une chaîne convertible en entier.

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

Posté(e)

Merci à vous...

 

Tramber : j'ai découvert la "puissance" de (cond dans CadXP, je ne sais plus où, mais c'est (souvent) plus simple qu'une suite de (if...

 

(gile) : j'ai consulté (une fois de plus) ton merveilleux "Introduction_a_AutoLISP"... Et effectivement, un getkword est plus approprié à ma routine que getstring...

 

Encore un grand merci à tous...

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)

Posté(e)

Salut Tramber...

 

Très instructif... Et mille merci pour tes deux réponses... Je pense choisir la deuxième et la traiter avec un cond, de ce genre :

(cond ((= Rep "Aucun")
...
)
((= Rep "Inconnu")
...
)
(((and (/= Rep "Aucun") (/= Rep "Inconnu"))
(setq valeur (atoi Rep))
...
)

 

Et encore merci...

 

(and (/= Rep "Aucun") (/= Rep "Inconnu"))

Est parfaitement inutile.

Si l'exécution est arrivée à ce point, c'est que les deux premières conditions n'ont pas été remplies.

On utilise en général T (toujours vrai) pour la dernière condition (valeur par défaut).

 

(cond 
 ((= Rep "Aucun")
  ;...
 )
 ((= Rep "Inconnu")
  ;...
 )
 (T
  (setq valeur (atoi Rep))
  ;...
 )
)

 

On peut aussi directement mettre l'expression (setq valeur (atoi Rep)) qui ne retournera jamais nil :

 

(cond 
 ((= Rep "Aucun")
  ;...
 )
 ((= Rep "Inconnu")
  ;...
 )
 ((setq valeur (atoi Rep))
  ;...
 )
)

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

Posté(e)

Ah ouais... Intéressant ton dernier code...

 

Merci pour cette précision...

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)

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é