| |  | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Creo | | |  | Behalten Sie Ihre IT-Sicherheit im Überblick, eine Pressemitteilung
|
Autor
|
Thema: Fortlaufender Variablenname (538 mal gelesen)
|
uli1601 Mitglied Konstrukteur

 Beiträge: 16 Registriert: 19.07.2007 Creo Elements/Direct3D 19.0 MM 19.0 Intel Xeon mit 64GB RAM Windows 7
|
erstellt am: 22. Apr. 2009 22:52 <-- editieren / zitieren --> Unities abgeben:         
Guten Abend allerseits, ich habe mal wieder ein Problem. Ich stoße mit meinen begrenzten LISP-Kentnissen mal wieder an meine Grenzen: :-) Ich habe mir ein defstuct "ergebnis" festgelegt. Nun würde ich gerne verschiedene Instanzen mit fortlaufender Variablenbezeichnung (z.B. ergebnis1) von meinem defstruct erzeugen. Hier mal mein Codeschnipsel dazu: Code:
(setf zaehler (+ zaehler 1)) (setf (sd-read-from-string (format NIL "ergebnis~A" zaehler)) (make-ergebnis ...))
Allerdings kann ich so keine Variablenbezeichnung erzeugen. Der Code liefert mir einen Fehler, dass das "(sd-read-from-string (format NIL "ergebnis~A" zaehler))" nicht erlaubt ist. Kann mir jemand weiterhelfen, ob und wie ich eine solche fortlaufende Variable realisieren könnte? schönen Abend Uli Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
clausb Ehrenmitglied V.I.P. h.c.
     
 Beiträge: 2914 Registriert: 20.12.2000 Ich schreibe das hier in meiner Freizeit und spreche weder für meinen Arbeitgeber noch für andere Firmen. Mehr Unsinn von mir unter clausbrod.de.
|
erstellt am: 22. Apr. 2009 23:30 <-- editieren / zitieren --> Unities abgeben:          Nur für uli1601
Zur Laufzeit dynamisch Variablensymbole anlegen und sie an Instanzen Deiner Struktur binden? Auch sowas geht in Lisp - anders als in vielen anderen Sprachen übrigens. Aber ich bin mir ziemlich sicher, dass Du das nicht wirklich willst oder Dir vielleicht nicht überlegt hast, was das alles nach sich zieht. Das Vorhaben sieht wirklich arg fischig aus. Wieso legst Du nicht einfach ein Array von Strukturen an? (Siehe dazu beispielsweise http://l1sp.org/cl/make-array ) Oder noch schlichter eine Liste? Claus ------------------ CoCreate Modeling FAQ: http://www.clausbrod.de/CoCreateModeling/
[Diese Nachricht wurde von clausb am 23. Apr. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
uli1601 Mitglied Konstrukteur

 Beiträge: 16 Registriert: 19.07.2007
|
erstellt am: 23. Apr. 2009 17:49 <-- editieren / zitieren --> Unities abgeben:         
Vielen Dank Claus, für die Tipps. Ich sehe schon, das mit defstruct war keine so gute Idee :-) Ich habe nun mal versucht, ein Array aufzubauen (mit Arrays habe ich bisher in LISP noch nichts gemacht...) Code: (setf ergebnis_array (make-array '(1 3) :adjustable t :initial-contents '(("sigma(N/mm^2)" "tau(N/mm^2)" "sigmav(N/mm^2)"))))
Soweit, so gut, jetzt habe ich mal mein Startarray bei der Initialisierung meines Dialogs erzeugt. Das möchte ich nun gerne erweitern und mit Werten füllen (deshalb um eine Zeile erweitern): Code: (setf ergebnis_array (adjust-array ergebnis_array '((+ 1 (array-rank ergebnis_array)) 13)))
Allerdings ist "'((+ 1 (array-rank ergebnis_array))" der falsche Ausdruck, ich bekomm eine Meldung, dass eine positive "fixnum" erwartet wird. Wenn ich anstatt dem Ausdruck einfach eine 2 schreibe, funktioniert das Ganze: Code: (setf ergebnis_array (adjust-array ergebnis_array '(2 13)))
Wobei ich bisher keine Ahnung habe, wie ich dann mein Array jeweils zeilenweise mit Werten (die ich als Variablen zur Verfügung habe) füllen kann... Hintergrund ist der, dass ich mir ein einfaches Biegeberechnungsprogramm geschrieben habe, bei dem ich einen Punkt auf einer Arbeitsebene anklicken kann, und mir dann sigma und tau an dieser Stelle ausgegeben werden. Diese ausgegebenen Werte würde ich gerne für jeden Klick speichern. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
clausb Ehrenmitglied V.I.P. h.c.
     
 Beiträge: 2914 Registriert: 20.12.2000 Ich schreibe das hier in meiner Freizeit und spreche weder für meinen Arbeitgeber noch für andere Firmen. Mehr Unsinn von mir unter clausbrod.de.
|
erstellt am: 23. Apr. 2009 19:32 <-- editieren / zitieren --> Unities abgeben:          Nur für uli1601
Gegen die Verwendung von Strukturen (die mit defstruct definiert werden) ist gar nichts einzuwenden - meine Zweifel betrafen die Idee, dynamisch Variablen zu erzeugen. Wie gesagt, Lisp kann sowas im Unterschied zu vielen anderen Sprachen, aber selbst in Lisp nutzt man solche Moeglichkeiten nicht so oft, meistens eher in mit defmacro erzeugten Makros. Dein Problem bei der Erweiterung des Arrays ist ein simples Quotierungsproblem, das wir schon ab und an mal hatten. Abhilfe: Code: (setf ergebnis_array (adjust-array ergebnis_array `((+ 1 ,(array-rank ergebnis_array)) 13)))
Allerdings solltest Du zunaechst ueberlegen, ob Du wirklich ein Array brauchst. Wie Du gesehen hast, sind dynamische Lisp-Arrays unter Umstaenden etwas wortreich in der Programmierung. Viel einfacher geht das mit Listen. Welche Datenstruktur in Deinem Fall am besten ist, musst Du aufgrund Deiner Anforderungen entscheiden. Arrays bieten sich von der Geschwindigkeit her an, wenn man oft wahlfrei auf Elemente im Array zugreifen muss. Listen sind optimal, wenn man sie im Code ohnehin immer komplett von vorne bis hinten abarbeitet, oder wenn man sie an Code weitergeben muss, der Listen erwartet. Listen sind auch bei wahlfreiem Zugriff akzeptabel, solange sie nicht zu gross werden. Zitat: Hintergrund ist der, dass ich mir ein einfaches Biegeberechnungsprogramm geschrieben habe, bei dem ich einen Punkt auf einer Arbeitsebene anklicken kann, und mir dann sigma und tau an dieser Stelle ausgegeben werden. Diese ausgegebenen Werte würde ich gerne für jeden Klick speichern.
Diese Beschreibung klingt zunaechst mal so, als ob eine einfache Liste hier ausreicht. Damit wuerde Dein Code vermutlich trivial. Ob Du in Deiner Liste mit defstruct definierte Strukturen speicherst oder aber einfach wiederum drei(?)elementige Listen, ist eine andere und eher nebensaechliche Frage. Code-Anregungen, voellig ungetestet:
Code:
(in-package :biegeberechnung) (use-package :Oli) (defstruct point sigma tau sigmav) (defparameter *pointlist* nil) (defun add-point(sigma tau sigmav) (push (make-point :sigma sigma :tau tau :sigmav sigmav) pointlist))
Claus [Diese Nachricht wurde von clausb am 23. Apr. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
 |