| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Variablenname als Parameter mitgeben (498 mal gelesen)
|
Peter2 Ehrenmitglied V.I.P. h.c.
Beiträge: 3701 Registriert: 15.10.2003 Win 10/64 Pro AutoCAD MAP 3D 2018 BricsCAD 22
|
erstellt am: 01. Sep. 2009 11:09 <-- editieren / zitieren --> Unities abgeben:
Ich möchte eine Nebenroutine schreiben, die als Parameter nicht nur die Ausgangswerte, sondern auch den Namen des Zielwertes enthält: Beispiel (funktioniert aber nicht):
Code: (defun mal (a b c) (setq c (* a b)) )
Ich starte mit Code: (mal 5 3 Wert1)
und das Programm rechnet mit
Code: (setq wert1 (* 5 3)
und am Schluss ist in der Variable Wert1 die Zahl 15 gespeichert.Und dann geht es weiter mit
Code: (mal 12.3 18.5 Wert2)
usw.Ich bedanke mich für Tipps zu einem funktionierendem Code. Peter ------------------ Für jedes Problem gibt es eine einfache Lösung. Die ist aber meistens falsch. ;-) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 01. Sep. 2009 11:21 <-- editieren / zitieren --> Unities abgeben: Nur für Peter2
Zitat: Original erstellt von Peter2: Ich möchte eine Nebenroutine schreiben, die als Parameter nicht nur die Ausgangswerte, sondern auch den Namen des Zielwertes enthält:Beispiel (funktioniert aber nicht):
Code: (defun mal (a b c) (setq c (* a b)) )
...
Hallo Peter, mit einer minimalen Änderung, kannst du das Ziel erreichen:
Code: (defun mal (a b c) (set c (* a b)) ) (mal 10.0 2.0 'd) (princ d)
Bei Fragen ... Grüße! Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13508 Registriert: 30.11.2003 .
|
erstellt am: 01. Sep. 2009 11:22 <-- editieren / zitieren --> Unities abgeben: Nur für Peter2
(defun MAL (A B VARNAME) (if(and (numberp A) (numberp B) (or(=(type VARNAME)'STR) (=(type VARNAME)'SYM) ) ) (cond ((=(type VARNAME)'STR) (set (read VARNAME)(* A B)) ) ((=(type VARNAME)'SYM) (set VARNAME (* A B)) ) ) ) ) (MAL 4 5 'DDD) oder (MAL 4 5 "DDD")
sollten funktionieren
------------------ - Thomas - "Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben." Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 01. Sep. 2009 11:26 <-- editieren / zitieren --> Unities abgeben: Nur für Peter2
Zitat: Original erstellt von Peter2: Ich möchte eine Nebenroutine schreiben, die als Parameter nicht nur die Ausgangswerte, sondern auch den Namen des Zielwertes enthält:Beispiel (funktioniert aber nicht):
Code: (defun mal (a b c) (setq c (* a b)) )
...
Hallo Peter, eine Anmerkung zur Sinnhaftigkeit deines Vorhabens: Ich habe in meiner doch recht langen Zeit des Programmierens noch nicht den Fall erlebt, dass ich auf diesem Weg Variablen Werte zuweisen muss. In aller Regel sollte man die SUB-Funktion dann doch so gestalten, dass diese ein Ergebnis liefert: (defun mal (a b / erg) (setq erg (* a b)) erg ) ... (setq Wert1 (mal 10.0 2.0)) ... Das ist sauber und lässt auch in 2 Jahren den Programmierer verstehen, warum die Variable Wert1 an dieser Stelle des Codes den Wert 20.0 enthält. Ich kenne nun den Zusammenhang nicht, möchte dir dennoch empfehlen, dein Vorhaben noch einmal zu überdenken! Bei Fragen ... Grüße! Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Peter2 Ehrenmitglied V.I.P. h.c.
Beiträge: 3701 Registriert: 15.10.2003 Win 10/64 Pro AutoCAD MAP 3D 2018 BricsCAD 22
|
erstellt am: 01. Sep. 2009 11:38 <-- editieren / zitieren --> Unities abgeben:
Danke an beide @Holger - 1: ja, die kleinen Strichlein '' und set statt setq - das ist immer dann ganz logisch, wenn man es bei anderen liest. @cadmium: Danke, eine sehr grundsätzliche Lösung. @Holger - 2: Ja, da liegt mein Ansatz doch sehr quer im Raum. Da habe ich mich ein wenig verlaufen. Peter ------------------ Für jedes Problem gibt es eine einfache Lösung. Die ist aber meistens falsch. ;-) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13508 Registriert: 30.11.2003 .
|
erstellt am: 01. Sep. 2009 11:39 <-- editieren / zitieren --> Unities abgeben: Nur für Peter2
zum Thema Variablenübergabe: wenn eine Unterfunktion mehrere Werte zurückliefern soll, dann kann man die in eine Liste packen (defun TESTUS (/ A B C) (list (setq A 1) (setq B "TEST") (setq C '(1 . "AB")) ) ) im Hauptprogramm werden dann die Variablen D E F mit den Werten von Sub-A , Sub-B Sub-C wie folgt initialisiert : (mapcar '(lambda(X Y)(set X Y)) '(D E F) (TESTUS) ) nur mal am Rande
------------------ - Thomas - "Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben." Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Peter2 Ehrenmitglied V.I.P. h.c.
Beiträge: 3701 Registriert: 15.10.2003 Win 10/64 Pro AutoCAD MAP 3D 2018 BricsCAD 22
|
erstellt am: 01. Sep. 2009 11:50 <-- editieren / zitieren --> Unities abgeben:
Danke an beide @Holger - 1: ja, die kleinen Strichlein '' und set statt setq - das ist immer dann ganz logisch, wenn man es bei anderen liest. @cadmium: Danke, eine sehr grundsätzliche Lösung. @Holger - 2: Ja, da liegt mein Ansatz doch sehr quer im Raum. Da habe ich mich ein wenig verlaufen. (Eigentlich war der Ansatz der, dass das Ergebnis recht gross und recht häufig auftritt. Daher dachte ich, nicht "einheitlich ausrechnen und dann mit setq aufteilen", sondern schon beim ausrechnen gleich zuweisen - Reduzierung Rechnerlast?). Aber das ist eher Spielerei ... Peter ------------------ Für jedes Problem gibt es eine einfache Lösung. Die ist aber meistens falsch. ;-) [Diese Nachricht wurde von Peter2 am 01. Sep. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Geos Mitglied Vermessungstechniker i.R.
Beiträge: 1017 Registriert: 21.09.2001 ACAD Map 2010, Win 7 Pro eigene Lisp's<P>HW: Core i7 860, 2.8 GHz 3.3 GB, NVIDIA GeForce GTS 250
|
erstellt am: 01. Sep. 2009 17:25 <-- editieren / zitieren --> Unities abgeben: Nur für Peter2
Zitat: ...noch nicht den Fall erlebt, dass ich auf diesem Weg Variablen Werte zuweisen muss.
Vielleicht nicht "muss", aber zu "kann" fiele mir schon was ein - z.B.: Wenn das Programm wert1, wert2, usw. hochzählt, aber das Ende nicht bekannt, bzw. das Progr. die Var.Namen - aus irgendwelchen Ergebnissen - selbst bildet/zusammensetzt? Aber fragt mich jetzt nicht um ein konkretes Beispiel ...
------------------ Schöne Grüße Ernst www.geopaint.at Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archtools Mitglied
Beiträge: 823 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 01. Sep. 2009 23:39 <-- editieren / zitieren --> Unities abgeben: Nur für Peter2
Zitat: Original erstellt von Brischke: Hallo Peter, eine Anmerkung zur Sinnhaftigkeit deines Vorhabens: Ich habe in meiner doch recht langen Zeit des Programmierens noch nicht den Fall erlebt, dass ich auf diesem Weg Variablen Werte zuweisen muss.
Hallo Holger, ich mache das gar nicht selten, dass ich Funktionsnamen und Variablennamen als Symbole in anderen Variablen speichere, wenngleich natürlich nicht auf dieselbe Art wie in diesem Beispiel. Damit kann man äußerst elegante Code-Abkürzungen erreichen. Als Beispiel möge diese Funktion dienen, die genau so wie MAPCAR für Listen eine Funktion auf jedes Element eines Auswahlsatzes anwendet: Code:
(defun mapent (fun ss / i) (repeat (setq i (sslength ss)) ((lambda (proc args / ss fun i) (apply proc args) ) fun (list (ssname ss (setq i (1- i)))) ) ) )
So wie bei MAPCAR meist eine mit LAMBDA definierte temporäre Funktion auf eine Liste angewendet wird, wird hier eine Funktion an die Variable FUN in MAPENT übergeben, das diese dann elegant an die Variable PROC in der Lambda-Funkltion weiter reicht, die diese Funktion dann mit APPLY anwendet.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Peter2 Ehrenmitglied V.I.P. h.c.
Beiträge: 3701 Registriert: 15.10.2003 Win 10/64 Pro AutoCAD MAP 3D 2018 BricsCAD 22
|
erstellt am: 02. Sep. 2009 00:09 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von Geos: ...Wenn das Programm wert1, wert2, usw. hochzählt, aber das Ende nicht bekannt, bzw. das Progr. die Var.Namen - aus irgendwelchen Ergebnissen - selbst bildet/zusammensetzt?...
Ich habe diese Frage mit Listen gelöst - da kann man immer den Werten beliebige Zähler oder selbsterzeugte Namen mitgeben. Alles recht schnell und mit den Listenfunktionen gut bearbeitbar. Peter ------------------ Für jedes Problem gibt es eine einfache Lösung. Die ist aber meistens falsch. ;-) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fuchsi Mitglied Programmierer c#.net Datawarehouse
Beiträge: 1201 Registriert: 14.10.2003 AutoCad Version 2012 deu/enu <P>Windows 7 64bit
|
erstellt am: 02. Sep. 2009 10:30 <-- editieren / zitieren --> Unities abgeben: Nur für Peter2
ich hatte einmal den Fall, dass ich errechnete Variablennamen verwendete. Ist zwar meist unsauber programmiert, aber da es lediglich ein einmaliges Konvertierungstools war, war es mir egal Das macht man folgenderweise : (SETQ Variablenname "WERT1") (SET (read variablenname) 55) (print (eval (read variablenname))) ; -> 55 (print wert1) ; -> 55 [Diese Nachricht wurde von fuchsi am 02. Sep. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archtools Mitglied
Beiträge: 823 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 02. Sep. 2009 12:15 <-- editieren / zitieren --> Unities abgeben: Nur für Peter2
Zitat: Original erstellt von fuchsi: ich hatte einmal den Fall, dass ich errechnete Variablennamen verwendete. Ist zwar meist unsauber programmiert, aber da es lediglich ein einmaliges Konvertierungstools war, war es mir egal
Bei meiner Nachprogrammierung von GEOMCAL letztes Wochenende habe ich sogar einer Variablen sich selbst zugewiesen, also z.B. (setq var 'var). Und ohne in Details zu gehen: unsauber programmiert war das ganz und gar nicht :-)
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 03. Sep. 2009 08:15 <-- editieren / zitieren --> Unities abgeben: Nur für Peter2
Hallo, klar arbeite ich auch mit der Übergabe von Funktionen an irgendwelche Funktionshüllen (Bsp von archtools). Das macht auch absolut Sinn - keine Frage. Hat man dieses Thema verinnerlicht, ergeben sich natürlich enorme Möglichkeiten der Code-Verkürzung. Nur so, wie das Bsp hier war, ist es mir noch nicht unter gekommen und halte ich es auch nicht für sinnig. Grüße Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |