Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  Element von Liste in Liste auf NIL prüfen

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte
Autor Thema:  Element von Liste in Liste auf NIL prüfen (1416 mal gelesen)
Peter2
Ehrenmitglied V.I.P. h.c.




Sehen Sie sich das Profil von Peter2 an!   Senden Sie eine Private Message an Peter2  Schreiben Sie einen Gästebucheintrag für Peter2

Beiträge: 3701
Registriert: 15.10.2003

Win 10/64 Pro
AutoCAD MAP 3D 2018
BricsCAD 22

erstellt am: 14. Mai. 2009 20:23    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Ich habe eine Liste mit 4000 Elementen, die alle auch Listen mit je 15 Elementen sind. Jetzt hole ich mir laufend die Elemente aus den Listen, z.B.

Code:
5. Element der 438. Liste
12. Element der 932. Liste

mein Zugriff erfolgt so:

Code:
(setq mein_wert1 (rtos (nth 4 (nth 437 grossliste)) 2 0)
    mein_wert2 (strcase (nth 6 (nth 437 grossliste)))

Die Elemente der Unterlisten sind aber sehr bunt gemischt - REAL, STR und NIL:

Code:
(25.0 nil nil nil nil "Guten Tag " nil nil nil nil nil "0" nil nil)

Jetzt klappt mein Code (z.B. mit RTOS) natürlich nicht, wenn dieser Wert NIL oder STR ist. Jetzt graut mir ein wenig vor den Fehlerabfragen wie
Code:
if NIL then ...
if STR then ...

Gibt es da eine sparsame Lösung?

Schönen Abend

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

cadffm
Moderator
良い精神




Sehen Sie sich das Profil von cadffm an!   Senden Sie eine Private Message an cadffm  Schreiben Sie einen Gästebucheintrag für cadffm

Beiträge: 21533
Registriert: 03.06.2002

Alles

erstellt am: 14. Mai. 2009 21:20    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Peter2 10 Unities + Antwort hilfreich

meine Frage wäre erstmal: Muß das so sein ???
Du mußt doch wissen (können) ob das 5.Element der50.Liste ein String ist oder nicht !?
falls das nicht so ist: Dann kommt die Prüfung vor der es dir graut - nur mache es nicht
mit 10 if-Abfragen sondern mit COND

andere Leute haben für sowas auch eine extra Sub in ihrer Bibo

------------------
die alte SUCHfunktion.. - System-Angaben - User:FAQ(Adesk)

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

wronzky
Ehrenmitglied V.I.P. h.c.
CAD-Dienstleistungen für Architekten



Sehen Sie sich das Profil von wronzky an!   Senden Sie eine Private Message an wronzky  Schreiben Sie einen Gästebucheintrag für wronzky

Beiträge: 2154
Registriert: 02.05.2005

CAD:
AutoCAD 2.6 bis 2014
ADT 2005 - 2014
Arcibem
System:
Windows 2000, XP, NO VISTA
Internet-Startseite:
http://www.archi.de

erstellt am: 14. Mai. 2009 22:04    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Peter2 10 Unities + Antwort hilfreich

...ausserdem kommt es darauf an, was Du danach machen willst.
brauchst Du immer einen String, dann nimm vl-princ-to-string.
oder Du fängst einfach die Fehler ab:
(if (vl-catch-all-error-p (setq val (vl-catch-all-apply 'rtos (list val)))) (setq val ""))

Grüsse, Henning

------------------
Henning Jesse
VoxelManufaktur
Computer-Dienstleistungen für Architekten und Ingenieure

  http://www.voxelman.de

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Peter2
Ehrenmitglied V.I.P. h.c.




Sehen Sie sich das Profil von Peter2 an!   Senden Sie eine Private Message an Peter2  Schreiben Sie einen Gästebucheintrag für Peter2

Beiträge: 3701
Registriert: 15.10.2003

Win 10/64 Pro
AutoCAD MAP 3D 2018
BricsCAD 22

erstellt am: 14. Mai. 2009 22:59    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Zitat:
Original erstellt von cadffm:
...Du mußt doch wissen (können) ob das 5.Element der50.Liste ein String ist oder nicht !?...

Die Liste sind eingelesene Excel-Daten in unterschiedlichen Inhalten - und daher weiß ich es leider nicht.

Zitat:
Original erstellt von wronzky:
...brauchst Du immer einen String, dann nimm vl-princ-to-string....


Das ist ein interessanter Ansatz - werde ich prüfen.

Zitat:
Original erstellt von wronzky:
...(if (vl-catch-all-error-p (setq val (vl-catch-all-apply 'rtos (list val)))) (setq val ""))...

Das sagt mir derzeit noch nicht viel, aber ich werde es auch testen.

Danke und schönen Abend

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

Dorfy
Mitglied
Double-Dipl.-Ing. Bleistiftanspitzer


Sehen Sie sich das Profil von Dorfy an!   Senden Sie eine Private Message an Dorfy  Schreiben Sie einen Gästebucheintrag für Dorfy

Beiträge: 900
Registriert: 21.07.2006

AutoCad2007, ProE, HiCad

erstellt am: 15. Mai. 2009 06:43    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Peter2 10 Unities + Antwort hilfreich

Hi,
mix die beiden Vorschläge
mit vl-catch-all-apply ne Sub aufrufen

Sub:
(cond
    ((= (type input) 'VLA-OBJECT) input)
    ((= (type input) 'ENAME)(vlax-ename->vla-object input))
     ;;............
    (T Nil)
  )

mfg heiko

Edit: oder Eingsngswert mit type auswerten und je nach Ausgabetype, mittels diversen kleinen subs, den Wert konvertieren

[Diese Nachricht wurde von Dorfy am 15. Mai. 2009 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

andi2050
Mitglied



Sehen Sie sich das Profil von andi2050 an!   Senden Sie eine Private Message an andi2050  Schreiben Sie einen Gästebucheintrag für andi2050

Beiträge: 107
Registriert: 11.03.2003

erstellt am: 15. Mai. 2009 17:01    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Peter2 10 Unities + Antwort hilfreich

Wenn es nur die 4 Varianten gibt ('str 'real 'int 'nil) dann ist das doch nicht so schlimm.

(defun val2str (val / tp)
(setq tp (type val))
(cond ((= tp 'str) val)
      ((= tp 'real) (rtos val 2 3))
      ((= tp 'int) (itoa val))
      ((= tp 'nil) "")
      ('T (alert "Typ nicht definiert") "")
)
)

Grüße
Andi

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Brischke
Moderator
CAD on demand GmbH




Sehen Sie sich das Profil von Brischke an!   Senden Sie eine Private Message an Brischke  Schreiben Sie einen Gästebucheintrag für Brischke

Beiträge: 4171
Registriert: 17.05.2001

AutoCAD 20XX, defun-tools (d-tools.eu)

erstellt am: 15. Mai. 2009 17:38    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Peter2 10 Unities + Antwort hilfreich

Hallo Peter,

aus meiner Sicht gibt es nun verschiedene Möglichkeiten an das Thema zu gehen:
1) Ein NIL wird ja bestimmt nicht aus Excel geliefert, deshalb sollte man an der Stelle des Auswertens der Excel-Daten vielleicht einen Leerstring anstelle des NIL's erzeugen.

2) Wenn du die NIL-Elemente nicht benötigst und die Position der anderen Elemente innerhalb dieser Liste keine Bedeutung haben, dann schmeiß einfach alle NIL's aus der Liste raus:
(vl-remove-if 'Not [LISTE])

3) Du bearbeitest die Liste in der Art wie das hier bereits formuliert wurde:
(defun VAL2STRING (val / valtyp)
(setq valtyp (type val))
(cond
((not val)"")
((= valtyp 'STR) val)
((= valtyp 'INT) (itoa val))
((= valtyp 'REAL) (rtos val))
((= valtyp 'LIST) (apply 'strcat (mapcar 'VAL2STRING val)))
(T "*ERROR*")
)
)

(Ich habe das nur hier im Editor runter getippt, Syntax noch prüfen!)

)
(setq LISTE (mapcar 'VAL2STRING LISTE))

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.




Sehen Sie sich das Profil von Peter2 an!   Senden Sie eine Private Message an Peter2  Schreiben Sie einen Gästebucheintrag für Peter2

Beiträge: 3701
Registriert: 15.10.2003

Win 10/64 Pro
AutoCAD MAP 3D 2018
BricsCAD 22

erstellt am: 15. Mai. 2009 20:23    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Dank an alle - die Sache scheint jetzt recht klar. Ich kann aber erst nächste Woche (oder nach dem Urlaub) das vertieft betrachten.

Zitat:
Original erstellt von Dorfy:
...Edit: oder Eingsngswert mit type auswerten und je nach Ausgabetype, mittels diversen kleinen subs, den Wert konvertieren...

Wie oben gesagt - gerade das hat mich nicht übermäßig verlockt ...

Zitat:
Original erstellt von Brischke:
...
1) Ein NIL wird ja bestimmt nicht aus Excel geliefert, deshalb sollte man an der Stelle des Auswertens der Excel-Daten vielleicht einen Leerstring anstelle des NIL's erzeugen.


Das ist sicher das Beste. Da dieser Codeteil aber ein komplexeres Internet-Fundstück ist habe ich gar nicht so recht hineingeschaut. Das sollte ich aber nachholen.

Zitat:
Original erstellt von Brischke:
...
2) Wenn du die NIL-Elemente nicht benötigst und die Position der anderen Elemente innerhalb dieser Liste keine Bedeutung haben, dann schmeiß einfach alle NIL's aus der Liste raus:
(vl-remove-if 'Not [LISTE])


Das geht nicht, weil die Position absolut wichtig ist.

Zitat:
Original erstellt von Brischke:
...
3) Du bearbeitest die Liste in der Art wie das hier bereits formuliert wurde:
(defun VAL2STRING (val / valtyp)
(setq valtyp (type val))
(cond
((not val)"")
((= valtyp 'STR) val)
((= valtyp 'INT) (itoa val))
((= valtyp 'REAL) (rtos val))
((= valtyp 'LIST) (apply 'strcat (mapcar 'VAL2STRING val)))
(T "*ERROR*")
)
)

(Ich habe das nur hier im Editor runter getippt, Syntax noch prüfen!)

)
(setq LISTE (mapcar 'VAL2STRING LISTE))...



Siehe oben - muss ich anschauen.

Noch ein schönes Wochenende an alle.

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

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz