| 
|  |  |  |  | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |  |  |  |  |  | NVIDIA RTX PRO 6000 Blackwell Max-Q Workstation Edition, eine Pressemitteilung 
 |  
| Autor | Thema:  Subroutinen crash (1071 mal gelesen) |  | cadplayer Ehrenmitglied
 CADniker
 
      
 
      Beiträge: 1838Registriert: 28.04.2009
 Windows 1064bit system
 Autocad Civil3d 2020 ENGLISH
 Visual Studio 2019
 OpenDCL.Runtime.9<P>
 |    erstellt am: 16. Aug. 2013 08:45  <-- editieren / zitieren -->    Unities abgeben:            
  Ich hätte mal eine Frage, wie es die Profis lösen mit Subroutinen zu hantieren. In meinem Fall, starten 2 Programme, die die gleiche Unterfunktion hernehmen, ABER mit unterschiedlich vielen Argumenten bestückt werden. D.h. im eigentlichen Sinn es sind zwei unterschiedlich Routinen mit dem gleichen Namen. Klar ist, wenn die 2 Programme geladen werden, die Subroutines mit der letzt geladenen überschrieben werden. Einfach wäre, die Subroutine umzunennen, gibt es noch einen anderen Weg ausser jetzt mal mit lambda? ------------------Gruss Dirk
 http://cadplayerlounge.blogspot.se Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |  | CADmium Moderator
 Maschinenbaukonstrukteur
 
         
 
  
 
      Beiträge: 13533Registriert: 30.11.2003
 . |    erstellt am: 16. Aug. 2013 09:07  <-- editieren / zitieren -->    Unities abgeben:           Nur für cadplayer   |  | cadplayer Ehrenmitglied
 CADniker
 
      
 
      Beiträge: 1838Registriert: 28.04.2009
 Windows 1064bit system
 Autocad Civil3d 2020 ENGLISH
 Visual Studio 2019
 OpenDCL.Runtime.9<P>
 |    erstellt am: 16. Aug. 2013 09:45  <-- editieren / zitieren -->    Unities abgeben:            |  | joern bosse Ehrenmitglied
 Dipl.-Ing. Vermessung und AutoLISPler
 
      
 
      Beiträge: 1781Registriert: 11.10.2004
 Window 11ACAD 2021
 CIVIL 2021
 BricsCAD ab V14
 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz   2.80 GHz
 32.0GB RAM
 NVIDIA GeForce MX450<P>
 |    erstellt am: 16. Aug. 2013 11:35  <-- editieren / zitieren -->    Unities abgeben:           Nur für cadplayer   
  Hallo, das Problem besteht bei mir auch immer mal wieder, wenn ich Funktionen um Argumente erweitern muss, aber gleichzeitig sicherstellen muß, das diese Funktionen dann auch mit den Aufrufen aus alten Programmen noch funktionieren. Ein Argument wird dann einfach als Liste zusammengefasst und in der Funktion wird das Argument mit der Funktion TYPE geprüft. Wenn es eine Liste ist, dann kann die Liste auseinandergenommen werden, wenn nicht, dann werden z.B. fehlende Argumente einfach gesetzt. Beispiel:
 Code:
 ;;;alte Funktion ohne Flag
 ;;;(defun Message (MSG / )
 ;;;  (alert MSG)
 ;;;  )
 ;;;aktualisierte Funktion mit Flag(defun Message (MSG / Flag)
 ;;;abfragen welcher Typ die Variable ist
 (if (=(type MSG)'STR)
 (setq Flag 'T)
 (setq Flag (cadr MSG)
 MSG (car MSG)))
 (if Flag
 (alert MSG)
 (alert "heute keine Meldung"))
 )
 (defun c:AlterAufruf ( / )
 (Message "Schreib was")
 )
 (defun c:NeuerAufruf ( / )
 (Message (list "Schreib was" 'T))
 )
 
 
 
 In dem Beispiel wurde ursprünglich ein String übergeben. Dann erfolgte eine Änderung die ein zusätzliches Flag erforderlich gemacht hat. Wenn jetzt ein "alter" Funktionsaufruf nur mit dem String stattfindet, dann wird das Flag automatisch gesetzt, wenn ein "neuer" Funktionsaufruf stattfindet, dann wird das Flag in der Liste übergeben. Vom Prinzip entspricht das einer überladenen Funktion, wenn auch ziemlich mit der Holzhammermethode und ein wenig unelegant, aber es funzt.   ------------------viele Grüße
 Jörnhttp://www.bosse-engineering.com
 Kordinaten einlesen Youtube Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |  | archtools Mitglied
 
 
     
 
      Beiträge: 1059Registriert: 09.10.2004
 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme |    erstellt am: 16. Aug. 2013 18:41  <-- editieren / zitieren -->    Unities abgeben:           Nur für cadplayer   
 Zitat:Original erstellt von CADmium:
 ...überladen geht in Lisp nicht.
 Ich hab mir angewöhnt, die Funktionen lokal zu definieren ... z.B. so (defun C:MACHWAS(/ SUB1 VAR)(defun SUB1( VAR1 )
 (princ VAR1)
 )
 (setq VAR "BLA")
 (SUB1 VAR)
 (princ)
 )
 
 damit umgehe ich solche Namenskonflikte ...
 
 Naja, der Sinn von benannten Funktionen ist ja gerade der, dass man sie nur einmal definiert und dann beliebig oft verwendet. Wenn man's nur einmal braucht, dann tut's auch eine anonyme Funktion. Wenn man sowas wie da oben öfter macht, dann kann man so ein Programm später praktisch gar nicht mehr pflegen ... Dass ich es für den zweitgrößten Nachteil von VisualLisp halte, dass man Funktionen nicht überladen kann, hab' ich ja schon öfter gesagt (der größte Nachteil ist, dass man keine Makros programmieren kann). Irgendwo hab' ich doch auch mal ein bißchen Code gezeigt, wie man das Überladen ansatzweise nachbilden kann. Es wäre für Autodesk ein Klacks, Makros und Überladen einzubauen. Die wollen halt nicht. Ab einer gewissen Komplexität der Applikation ist es sinnvoll, solche Lisp-Funktionen in C# zu programmieren. Und dabei kann man natürlich auch die schon eingebauten Funktionen umdefinieren. Beispielsweise addiert bei mir die +-Funktion nicht nur Zahlen, sondern auch Koordinatenpunkte. Sowas kann man in VisualLisp alleine leider nicht umdefinieren, weil man da keine Funktionen mit beliebig vielen Argumenten definieren kann. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |  | Brischke Moderator
 CAD on demand GmbH
 
         
 
  
 
      Beiträge: 4201Registriert: 17.05.2001
 AutoCAD 20XX, defun-tools (d-tools.eu) |    erstellt am: 16. Aug. 2013 19:21  <-- editieren / zitieren -->    Unities abgeben:           Nur für cadplayer   
 Zitat:Original erstellt von archtools:
 ... Ab einer gewissen Komplexität der Applikation ist es sinnvoll, solche Lisp-Funktionen in C# zu programmieren. Und dabei kann man natürlich auch die schon eingebauten Funktionen umdefinieren. Beispielsweise addiert bei mir die +-Funktion nicht nur Zahlen, sondern auch Koordinatenpunkte. Sowas kann man in VisualLisp alleine leider nicht umdefinieren, weil man da keine Funktionen mit beliebig vielen Argumenten definieren kann.
 
 jupp, ich liebe es. Für die eigene Verwendung bzw für meine Kunden, die Funktionen mit verschiedenen Eingangsparametern benötigen, greife ich sehr gern auf die Definition Lisp-Funktionen in C# zurück und bin so sehr froh, dass die Funktionen überladen werden können. Das Überladen findet, intern betrachtet  dann tatsächlich so statt, wie es Jörn beschrieben hat. die Parameter kommen als Liste mit unterschiedlicher Elementanzahl an. Grüße!Holger
 ------------------Holger Brischke
 Freier C#.NET-Workshop Ende Oktober geplant. Bei Interesse bitte melden!
 CAD on demand GmbH
 Individuelle Lösungen von Heute auf Morgen.
 
  defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!
 
 
  
 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |  | archtools Mitglied
 
 
     
 
      Beiträge: 1059Registriert: 09.10.2004
 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme |    erstellt am: 16. Aug. 2013 19:49  <-- editieren / zitieren -->    Unities abgeben:           Nur für cadplayer   
 Zitat:Original erstellt von Brischke:
 
 jupp, ich liebe es. Für die eigene Verwendung bzw für meine Kunden, die Funktionen mit verschiedenen Eingangsparametern benötigen, greife ich sehr gern auf die Definition Lisp-Funktionen in C# zurück und bin so sehr froh, dass die Funktionen überladen werden können. Das Überladen findet, intern betrachtet  dann tatsächlich so statt, wie es Jörn beschrieben hat. die Parameter kommen als Liste mit unterschiedlicher Elementanzahl an. Grüße!Holger
 
 Eine Funktion, die verschieden oder gar beliebig viele Parameter zulässt (die dann in der aufgerufenen Funktion als Parameterliste abgreifbar sind), ist keine überladene Funktion. Das ist nur der Fall, wenn man tatsächlich verschiedene Funktionen mit gleichem Namen, aber mit unterschiedlicher Parameterzahl definiert. Das macht man in der Regel natürlich nicht, wenn da, beispielsweise bei der + Funktion, immer dasselbe passiert. Überladene Funktionen zeichnen sich in der Regel dadurch aus, dass sie tatsächlich auch unterschiedliche Funktionalität haben. In einem "richtigen" Lisp-System kann man Makros definieren. Beispiele für Makros wären etwa die SETQ und die DEFUN Funktion. Das ist eigentlich ziemlich simpel: in einem Makro legt man hauptsächlich fest, welche Parameter wann evaluiert werden. Man kann sowas wie SETQ in VisualLisp nicht programmieren, weil beim Aufruf der erste Parameter nicht, der zweite aber schon evaluiert werden soll.
 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |  | Anzeige.:
 Anzeige: (Infos zum Werbeplatz >>)
  |