FastFiber

subroutines met gegevensoverdracht heen en weer OPGELOST

Gestart door delangstevandestraat, do 09 01 2014, 08:04:31

Vorige topic - Volgende topic

delangstevandestraat

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:
Ik hou van werken,
ik kan er uuuren naar kijken...
daarom zorg ik ook dat er altijd genoeg overblijft voor morgen :-)

EddyBeerke

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))
)
Civil3d 2026, Blender 4.x gebruiker
Gebruiker sinds AutoCAD R12

http://eddylucas.c1.biz/
https://www.google.com/maps/contrib/109381066561676463628/photos/

delangstevandestraat

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)

Ik hou van werken,
ik kan er uuuren naar kijken...
daarom zorg ik ook dat er altijd genoeg overblijft voor morgen :-)

roy_043

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.

HofCAD

#4
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.
ACADcadabra

roy_043

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.

HofCAD

#6
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
ACADcadabra

roy_043

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

roy_043

Ik ben overigens nog steeds benieuwd naar een reactie van de OP.

delangstevandestraat

#9
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:
Ik hou van werken,
ik kan er uuuren naar kijken...
daarom zorg ik ook dat er altijd genoeg overblijft voor morgen :-)

delangstevandestraat

@ 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
Ik hou van werken,
ik kan er uuuren naar kijken...
daarom zorg ik ook dat er altijd genoeg overblijft voor morgen :-)