CADsite forum

AutoCAD => Autolisp => Topic gestart door: delangstevandestraat op do 09 01 2014, 08:04:31

Titel: subroutines met gegevensoverdracht heen en weer OPGELOST
Bericht door: delangstevandestraat op do 09 01 2014, 08:04:31
Een probleempje met subroutine's

(defun addho (pc ho)
  (cond ((= pc "v1")(setq ho "a1"))
        ((= pc "v2")(setq ho "a2"))
        ((= pc "v3")(setq ho "a3"))
))


(defun hoofdprog()
(addho str1 str2)
(addho str3 str4)
(addho str5 str6)
)


stel
str1 = "v2"
str3 = "v3"
str5 = "v4"


ik had verwacht dat na deze routines


str2 = "a2"
str4 = "a3"
str6 = blijft wat het was

in de debugging zie ik dat alles verloopt zoals verwacht, de locale var ho in de subfunctie wordt gewijzigd,
doch bij het beeindigen van de subfunctie wordt de waarde niet teruggekoppeld.

Waarschijnlijk heb ik iets vergeten :)

ofwel doe ik iets verkeerd...

ik voel me weer een dom blondje  :cry:
Titel: Re: subroutines met gegevensoverdracht heen en weer
Bericht door: EddyBeerke op do 09 01 2014, 08:27:51
Je wilt dat "addho" een waarde terug geeft naar het hoofd programma.
Bedoel je dit:
(defun addho (pc)
  (cond
((= pc "v1")(setq ho "a1"))
((= pc "v2")(setq ho "a2"))
((= pc "v3")(setq ho "a3"))
)
)


(defun hoofdprog()
(setq str2 (addho str1))
(setq str4 (addho str3))
(setq str6 (addho str4))
)
Titel: Re: subroutines met gegevensoverdracht heen en weer
Bericht door: delangstevandestraat op do 09 01 2014, 09:31:49
nee niet helemaal...

hoe leg ik het duidelijk uit...

twee tekstvelden zijn in relatie met elkaar
(zoals een naam in relatie is met een geslacht)
els = vrouw
kim = vrouw
pol = man
enz...

ik heb een "work around gevonden" die werkt maar waarschijnlijk kan het beter


(defun addho ()
  (cond ((= pc "v1")(setq ho "a1"))
           ((= pc "v2")(setq ho "a2"))
           ((= pc "v3")(setq ho "a3"))
))

(defun hoofdprog()
(setq pc str1 ho str2)
(addho)
(setq str2 ho)

(setq pc str3 ho str4)
(addho)
(setq str4 ho)

Titel: Re: subroutines met gegevensoverdracht heen en weer
Bericht door: roy_043 op do 09 01 2014, 12:16:07
Twee oplossingen:

(defun addho (pc ho)
  (cond ((= pc "v1")(set ho "a1"))
        ((= pc "v2")(set ho "a2"))
        ((= pc "v3")(set ho "a3"))
  )
)

(defun hoofdprog( / str1 str2 str3 str4 str5 str6)
  (setq str1 "v2")
  (setq str3 "v3")
  (setq str5 "v4")

  (addho str1 'str2)
  (addho str3 'str4)
  (addho str5 'str6)
 
  (print str2)
  (print str4)
  (print str6)
  (princ)
)


(defun addho (pc)
  (cond ((= pc "v1") "a1")
        ((= pc "v2") "a2")
        ((= pc "v3") "a3")
  )
)

(defun hoofdprog( / str1 str2 str3 str4 str5 str6)
  (setq str1 "v2")
  (setq str3 "v3")
  (setq str5 "v4")

  (setq str2 (addho str1))
  (setq str4 (addho str3))
  (setq str6 (addho str4))
 
  (print str2)
  (print str4)
  (print str6)
  (princ)
)


Ik raad je aan de 2e te kiezen. Maar het is nog beter om je te verdiepen in 'association lists' (zie function 'assoc'). Dit soort lijsten is bij uitstek geschikt voor dergelijke opgaven.
Titel: Re: subroutines met gegevensoverdracht heen en weer
Bericht door: HofCAD op do 16 01 2014, 14:49:15
Citaat van: roy_043 op do 09 01 2014, 12:16:07
Twee oplossingen:

Ik raad je aan de 2e te kiezen. Maar het is nog beter om je te verdiepen in 'association lists' (zie function 'assoc'). Dit soort lijsten is bij uitstek geschikt voor dergelijke opgaven.
Beste Roy,

Je programma's geven verschillende uitkomsten!
(defun addho (pc ho)
  (cond ((= pc "v1")(set ho "a1"))
        ((= pc "v2")(set ho "a2"))
        ((= pc "v3")(set ho "a3"))
  )
)
(defun c:hoofdprog( / str1 str2 str3 str4 str5 str6)
(setq str1 "v2" str2 nil str3 "v3" str4 nil str5 "v4" str6 "oud")
  (addho str1 'str2)
  (addho str3 'str4)
  (addho str5 'str6)
(princ (strcat "\nDoor de aanroep van (addho str1 'str2), (addho str3 'str4)"
                "\nen (addho str5 'str6) geldt:"))
(princ (strcat "\nstr1 was v2 en is nu: " (if Str1 str1) ","
               "\nstr2 was nil en is nu: " (if Str2 str2) ","
               "\nstr3 was v3 en is nu: " (if Str3 str3) ","
               "\nstr4 was nil en is nu: " (if Str4 str4) ","
               "\nstr5 was v4 en is nu: " (if Str5 str5) ","
               "\nstr6 was oud en is nu: " (if Str6 str6)
       )
)
(princ)
)

(defun addho2 (pc)
  (cond ((= pc "v1") "a1")
        ((= pc "v2") "a2")
        ((= pc "v3") "a3")
  )
)
(defun C:hoofdprog2( / str1 str2 str3 str4 str5 str6)
(setq str1 "v2" str2 nil str3 "v3" str4 nil str5 "v4" str6 "oud")
  (setq str2 (addho2 str1))
  (setq str4 (addho2 str3))
  (setq str6 (addho2 str5))
(princ (strcat "\nDoor de aanroep van (setq str2 (addho2 str1)), (setq str4 (addho2 str3))"
                "\nen (setq str6 (addho2 str4)) geldt:"))
(princ (strcat "\nstr1 was v2 en is nu: " (if Str1 str1 "nil") ","
               "\nstr2 was nil en is nu: " (if Str2 str2 "nil") ","
               "\nstr3 was v3 en is nu: " (if Str3 str3 "nil") ","
               "\nstr4 was nil en is nu: " (if Str4 str4 "nil") ","
               "\nstr5 was v4 en is nu: " (if Str5 str5 "nil") ","
               "\nstr6 was oud en is nu: " (if Str6 str6 "nil")
       )
)
(princ)
)

Het eerste  Hoofdprog programma geeft:
Door de aanroep van (addho str1 'str2), (addho str3 'str4)
en (addho str5 'str6) geldt:
str1 was v2 en is nu: v2,
str2 was nil en is nu: a2,
str3 was v3 en is nu: v3,
str4 was nil en is nu: a3,
str5 was v4 en is nu: v4,
str6 was oud en is nu: oud

Het tweede Hoofdprog2 programma geeft:
Door de aanroep van (setq str2 (addho2 str1)), (setq str4 (addho2 str3))
en (setq str6 (addho2 str5)) geldt:
str1 was v2 en is nu: v2,
str2 was nil en is nu: a2,
str3 was v3 en is nu: v3,
str4 was nil en is nu: a3,
str5 was v4 en is nu: v4,
str6 was oud en is nu: nil

Met vriendelijke groet, HofCAD CSI.
Titel: Re: subroutines met gegevensoverdracht heen en weer
Bericht door: roy_043 op do 16 01 2014, 15:05:49
Er zit een typefout in mijn 2e oplossing:
(setq str6 (addho str4))
Dit moet logischerwijs zijn:
(setq str6 (addho str5))
Vermoedelijk is dat de oorzaak.
Titel: Re: subroutines met gegevensoverdracht heen en weer
Bericht door: HofCAD op do 16 01 2014, 15:33:37
Citaat van: roy_043 op do 16 01 2014, 15:05:49
Er zit een typefout in mijn 2e oplossing:
(setq str6 (addho str4))
Dit moet logischerwijs zijn:
(setq str6 (addho str5))
Vermoedelijk is dat de oorzaak.
Beste Roy,

Ook na verandering van (setq str6 (addho str4)) in (setq str6 (addho str5)),
wordt de waarde str6 nil  ipv oud!
Het programma addho doet namelijk niets als pc "v4" is of pc nil is!

Met vriendelijke groet, HofCAD CSI.

(defun C:hoofdprog3( / str1 str2 str3 str4 str5 str6 ref h)
(setq str1 "v2" str2 nil str3 "v3" str4 nil str5 "v4" str6 "oud")
(setq ref '((v1 "a1") (v2 "a2") (v3 "a3")))
(if (setq h (assoc 'v2 ref)) (setq str2 (car (cdr h))))
(if (setq h (assoc 'v3 ref)) (setq str4 (car (cdr h))))
(if (setq h (assoc 'v4 ref)) (setq str6 (car (cdr h))))
(princ (strcat "\nstr1 was v2 en is nu: " (if Str1 str1 "nil") ","
               "\nstr2 was nil en is nu: " (if Str2 str2 "nil") ","
               "\nstr3 was v3 en is nu: " (if Str3 str3 "nil") ","
               "\nstr4 was nil en is nu: " (if Str4 str4 "nil") ","
               "\nstr5 was v4 en is nu: " (if Str5 str5 "nil") ","
               "\nstr6 was oud en is nu: " (if Str6 str6 "nil")
       )
)
(princ)
)

(defun C:hoofdprog4( / str1 str2 str3 str4 str5 str6 h)
(setq str1 "v2" str2 nil str3 "v3" str4 nil str5 "v4" str6 "oud")
(defun addho4 (pc / ref)
(setq ref '((v1 "a1") (v2 "a2") (v3 "a3")))
(if pc
(if (setq pc (assoc (read pc) ref)) (setq pc (car (cdr pc))))
)
)
(if (setq h (addho4 str1)) (setq str2 h))
(if (setq h (addho4 str3)) (setq str4 h))
(if (setq h (addho4 str5)) (setq str6 h))
(princ (strcat "\nstr1 was v2 en is nu: " (if str1 str1 "nil") ","
               "\nstr2 was nil en is nu: " (if str2 str2 "nil") ","
               "\nstr3 was v3 en is nu: " (if str3  str3 "nil") ","
               "\nstr4 was nil en is nu: " (if str4 str4 "nil") ","
               "\nstr5 was v4 en is nu: " (if str5 str5 "nil") ","
               "\nstr6 was oud en is nu: " (if str6 str6 "nil")
       )
)
(princ)
)

Hoofdprog3 en Hoofdprog4 geeft:
str1 was v2 en is nu: v2,
str2 was nil en is nu: a2,
str3 was v3 en is nu: v3,
str4 was nil en is nu: a3,
str5 was v4 en is nu: v4,
str6 was oud en is nu: oud
Titel: Re: subroutines met gegevensoverdracht heen en weer
Bericht door: roy_043 op do 16 01 2014, 17:14:11
Citaat van: HofCAD op do 16 01 2014, 15:33:37
Het programma addho doet namelijk niets als pc "v4" is of pc nil is!
Klopt maar dat komt overeen met de code in de eerste post van de OP. :wink:
Het belangrijkste uit mijn eerste bericht is vanzelfsprekend de opmerking over 'association lists'.
Titel: Re: subroutines met gegevensoverdracht heen en weer
Bericht door: roy_043 op do 16 01 2014, 17:15:32
Ik ben overigens nog steeds benieuwd naar een reactie van de OP.
Titel: Re: subroutines met gegevensoverdracht heen en weer
Bericht door: delangstevandestraat op vr 17 01 2014, 15:40:12
OP, dat ben ik zeker ?

Ja, ik had hier niet meer naar gekeken de laatste aangezien ik een work around had, en de verdieping van dit thema er dus enkel nog was om er slimmer uit te worden,

De 2de oplossing van roy is niet goed, want str6 mag niet veranderd worden...

ik zal het uitproberen en wordt vervolgd,

ook die assoc lists heb ik nog niet kunnen bekijken,
'k heb de laatste tijd nogal wat routines geschreven, en vandaar, tijdsdruk he jongens...

ik voel me er wel telkens een beetje minder blond door   :oops::icon_wub:
Titel: Re: subroutines met gegevensoverdracht heen en weer
Bericht door: delangstevandestraat op ma 20 01 2014, 08:55:09
@ roy

Die 1e oplossing werkt.  Ik had eerst wel over het hoofd gezien dat er set stond ipv setq...
Al bij al was ik dus eigenlijk al redelij goed bezig ?
enkel wordt er gebruikt gemaakt van set voor de variabelen die in de subroutine gewijzigd worden, en worden deze aangeroepen met 'ervoor.

Ik vind dat deze 1e oplossing het makkelijkst leest...

Nu kan ik dus op zoek naar het hoe en waarom, en de verschillen tussen set en setq :-)

Toch al bedankt hé mannen