| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| Request a special discount on NVIDIA RTX 5000 Ada Generation GPU !, eine Pressemitteilung
|
Autor
|
Thema: in lisp variablen-felder erzeugen?! (752 mal gelesen)
|
Schachinger Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 2041 Registriert: 08.04.2002
|
erstellt am: 15. Feb. 2004 20:25 <-- editieren / zitieren --> Unities abgeben:
hallo forum! wieder mal eine frage für die man mich wohl am besten an den lisp-pranger zur allgemeinen belustigung stellen sollte *G* aber da mir alles was ich über lisp weis im selbststudium erarbeitet habe und in meinem umfeld leider keine ansprechperson dazu habe muss ich meine - diesmal wieder grundlegende - frage wohl hier ins forum stellen also: in z.b. c++ kann man ja wunderbar z.b. 2-dimensionale variablenfelder erzeugen. z.b. eine variable x mit den spalten y und den reihen z. x(y,z) oder so ähnlich... gibts in lisp eine ähnliche möglichkeit?!? ------------------ mfg Siegfried Schachinger http://www.tbschatz.at Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Claudio Mitglied Architekt
Beiträge: 334 Registriert: 13.04.2002 ACA, Revit, MAX 2020
|
erstellt am: 15. Feb. 2004 21:03 <-- editieren / zitieren --> Unities abgeben: Nur für Schachinger
;;eine Lösung? (defun dimvars (x y z / A) (setq A (* (* x y ) z)) ) (defun c:Mach () (setq a (dimvars 1 2 3)) ;;; Variblenzuweisung X=1,Y=2,Z=3 (princ "Der Wert ist : ")(princ a)(princ) ) ;;;Gruß Claudio Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Schachinger Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 2041 Registriert: 08.04.2002
|
erstellt am: 15. Feb. 2004 21:58 <-- editieren / zitieren --> Unities abgeben:
hallo claudio, ne das wars nicht ganz - ich meinte keine multiplikation oder andere rechenoperation zw. verschiedenen variablen. sondern nur mal als beispiel (hat jetzt nichts mit dem zutun für das ich das brauchen würde aber damit sollte klar sein was ich meinte): z.b. schach.... 8x8 felder auf dem spielfeld. am besten lässt sich sowas "durchrechnen" durch ein 2dimensonales variablenfeld. z.b. in der variable "schach(1,1)" ist gespeichert welcher stein auf diesem feld steht oder ob er leer ist( zu beginn ein weißer turm). oder in der variable "schach(7,7)" ein schwarzer bauer zu beginn... meine frage ist ob es in lisp eine möglichkeit gibt solche variablenfelder zu definieren oder zu "simulieren"? ------------------ mfg Siegfried Schachinger http://www.tbschatz.at Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 15. Feb. 2004 22:15 <-- editieren / zitieren --> Unities abgeben: Nur für Schachinger
Hallo Schachinger, das ist in meinen Augen nichts weiter als eine Liste mit Listen als Listenelement. Die kannst du dir in Lisp aufbauen, wie du möchtest. und eine Subfunktion zu schreiben, die dir das Element (1,2) aus der Liste liest, ist ja nun mit (nth..) auch kein Problem. Vielleicht denkst du etwas zu kompliziert. Bsp: '( (1 2 3 4 5 6 7 8) (1 2 3 4 5 6 7 8) (1 2 3 4 5 6 7 8) (1 2 3 4 5 6 7 8) (1 2 3 4 5 6 7 8) (1 2 3 4 5 6 7 8) (1 2 3 4 5 6 7 8) (1 2 3 4 5 6 7 8) ) Grüße Holger ------------------ Holger Brischke (defun - Lisp over night! AutoLISP-Programmierung für AutoCAD Da weiß man, wann man's hat! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Schachinger Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 2041 Registriert: 08.04.2002
|
erstellt am: 16. Feb. 2004 07:40 <-- editieren / zitieren --> Unities abgeben:
|
Speedcad Mitglied
Beiträge: 76 Registriert: 17.01.2004
|
erstellt am: 16. Feb. 2004 09:37 <-- editieren / zitieren --> Unities abgeben: Nur für Schachinger
Erwarte aber keine Geschwindigkeit beim abrufen deiner Speicherfelder. Bei Listen sind die Speicher durch Zeiger verkettet , das heißt die Funktion nth muss die Liste immer von vorne durch zählen um beispielsweise das letzte Element zu bekommen (erste Element hat ein Zeiger auf zweite Element , zweite auf dritte usw.). Wahrscheinlich sind die angelegten Speicherorte dann auch noch vom Typ double. Da Lisp dann auch noch zur Laufzeit interpretiert ist das ganze dann ar...langsam. Das ist übrigens einer der Nachteile von Lisp (muss auch mal erwähnt sein). Ein wenig schneller geht’s dann so: Wenn du z.B. die x Reihe als fortlaufende Variable definierst (x1 ; x2 ; x3 usw.)dann eine Liste darauf setzen und mit den y-Werten füllen. (setq nummer 5) ; x Nummerrierung (set (setq vari (read (strcat "x" (itoa nummer )))) '() ) (set vari (cons y3 (eval vari))) Abfragen dann so : (setq nummer 5) (setq x5y3 (nth 3(eval (setq vari (read (strcat "x"(itoa nummer))))))) Was dann jeweils die bessere Variante ist musst du dann austesten. Es scheint das Autolisp zum schnellen Speichern und Abfragen von größeren Datenmengen denkbar ungeeignet ist. Ich lasse mich aber gerne eines Besseren belehren (mein Wissen ist begrenzt--ich weiß nicht ob Visuallisp da bessere Möglichkeiten hat). Gruß Speedcad
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mapcar Mitglied CADmin
Beiträge: 1250 Registriert: 20.05.2002 Time flies like an arrow, fruit flies like a banana (Groucho Marx)
|
erstellt am: 18. Feb. 2004 13:42 <-- editieren / zitieren --> Unities abgeben: Nur für Schachinger
Im Prinzip ist ja (fast) alles richtig, was hier gesagt wurde. Nur eins wurde nicht erwähnt: Lisp kennt ja nun schon seit geraumer Zeit den Datentyp Array: Angefangen mit vlax-make-safearray gibt es etwa zehn Lisp-Funktionen, die alle nur für diesen Datentyp zuständig sind. Allerdings gibt es eine Grenze - mehr als 16-dimensionale Arrays gehen nicht. In der Praxis sind aber Listen meistens doch flexibler - bei allen Programmen mit großen Datenmengen, die ich bisher geschrieben habe, sah es nämlich so aus, dass die Daten nicht wirklich 'rechteckig' waren, beispielsweise so etwa: Von Größe 1 bis Größe 900 sind sechs Bohrungen drin, aber von 901 bis 1000 sind es 8;-) Der Vorteil von Listen ist dann, dass man bei nicht vorhandenem Datum ein Nil zurückkriegt, ein Array muss man natürlich komplett initialisieren und muss dann Entscheidungskriterien haben, ob eine 0 den Wert Null bedeutet oder 'kein Wert vorhanden'. Ich habe mich bisher immer für Listen entschieden, auch bei sehr großen Datenmengen. Man muss halt nur den Unterschied zwischen cons und append kennen, sonst kann's wirklich langsam werden:-( Gruß, Axel ------------------ Meine AutoLisp-Seiten Meine private Homepage Mein Angriff auf dein Zwerchfell Mein Lexikon der Fotografie Mein gereimtes Gesülze Meine Überzeugung... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
marc.scherer Ehrenmitglied V.I.P. h.c. CAD-Administrator
Beiträge: 2494 Registriert: 02.11.2001 Windows 10 64bit AutoCAD Architecture 2018/2019 (deu/eng) AEC-Collection 2019 (Revit und Zeugs) Wenn sich's nicht vermeiden läßt: D-A-CH Erweiterung (mies implementierter Schrott)
|
erstellt am: 18. Feb. 2004 14:13 <-- editieren / zitieren --> Unities abgeben: Nur für Schachinger
|
Speedcad Mitglied
Beiträge: 76 Registriert: 17.01.2004
|
erstellt am: 18. Feb. 2004 20:12 <-- editieren / zitieren --> Unities abgeben: Nur für Schachinger
Hallo Axel, würde mich auch freuen wieder öfters von dir ein par Beiträge zu lesen . Schon bevor ich hier Mitglied war habe ich deine Beträge gerne mitverfolgt. Ich bin natürlich beim googeln in Sachen Arrey und Visuallisp gleich auf deiner Homepage gelandet. Das es Arrays in Visuallisp gibt wusste ich nicht (wird Zeit das ich mich mal mit Visuallisp beschäftige). Gruß Speedcad
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |