| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY WIRD VON NVIDIA ZUM HÄNDLER DES JAHRES GEWÄHLT, eine Pressemitteilung
|
Autor
|
Thema: Fehlerhafter Argumenttyp (2786 mal gelesen)
|
Bernd10 Mitglied
Beiträge: 763 Registriert: 20.11.2003 Intel(R) Xeon(R) W-2123 CPU @ 3.60GHz 16 GB RAM Windows 10 Pro 64-bit AutoCAD Mechnical 2020 Deu
|
erstellt am: 11. Jan. 2008 10:52 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich habe eine VLX-Anwendung, die aus sehr sehr vielen Lisp-Funktionen besteht. Nun kommt es unregelmäßig zu einem Abbruch bei verschiedenen eigenen Befehlen mit der folgenden Fehlermeldung: Fehlerhafter Argumenttyp: stringp nil Wir der Befehl unmittelbar danach noch ein Mal ausgeführt, tritt der Fehler nicht mehr auf. Ich kann bei der Fehlermeldung nicht erkennen um welche Variable es sich handelt. Um die Variable mit dem falschen Wert zu finden, habe ich in den Funktionen verschiedene Meldungen für das Textfenster eingebaut. Leider konnte ich auch dadurch die Variable mit dem falschen Wert nicht finden. Gibt es eine Möglichkeit, die Variable mit dem falschen Wert herauszufinden? Danke im Voraus und viele Grüße Bernd Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 11. Jan. 2008 11:06 <-- editieren / zitieren --> Unities abgeben: Nur für Bernd10
es handelt sich vermutlich um eine globale Variable, die vor der ersten Initialisierung (mit ner Zeichenkette) schon mal an eine Funktion , die ne Zeichenkette erwartet übergeben wird. Ohne Quelltext, ne sauberen Strukturierung und mal einem Debugging im VLIDE wirst du wohl nicht viel weiter kommen und die Hilfe sich unsererseits auch erschöpfen. ------------------ - 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 |
Bernd10 Mitglied
Beiträge: 763 Registriert: 20.11.2003 Intel(R) Xeon(R) W-2123 CPU @ 3.60GHz 16 GB RAM Windows 10 Pro 64-bit AutoCAD Mechnical 2020 Deu
|
erstellt am: 11. Jan. 2008 11:57 <-- editieren / zitieren --> Unities abgeben:
Hallo Thomas, ich gehe normalerweise immer per Debugger durch die Sourcen um Fehler zu finden. Da der Befehl beim zweiten Aufruf immer ohne Fehler durchläuft, komme ich in diesem Fall mit einem Debuglauf nicht weiter. Ich habe deshalb auf eine andere Möglichkeit (zum Beispiel die Ausgabe vom Namen der Variablen mit falschen Inhalt in das Textfenster) gehofft. Ist so was möglich? Danke und Gruß Bernd Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 11. Jan. 2008 12:12 <-- editieren / zitieren --> Unities abgeben: Nur für Bernd10
|
Bernd10 Mitglied
Beiträge: 763 Registriert: 20.11.2003 Intel(R) Xeon(R) W-2123 CPU @ 3.60GHz 16 GB RAM Windows 10 Pro 64-bit AutoCAD Mechnical 2020 Deu
|
erstellt am: 11. Jan. 2008 13:12 <-- editieren / zitieren --> Unities abgeben:
Hallo Thomas, Zitat: Original erstellt von CADmium: Dann debug doch den ersten Durchlauf ..
das kann ich leider nicht, da der Fehler bei den Benutzern meiner VLX-Anwendung auftritt. In der Praxis sieht es so aus, dass die Benutzer bei mir anrufen und mich über den Fehler informieren. Dann gehe ich an den Arbeitsplatz des Benutzers und kann mir nur noch den Inhalt des Textfenster und die LOG-Datei anschauen. Bisher habe ich dadurch aber nur herausgefunden, dass eine Variable mit dem Wert nil den Fehler verursacht. Ich müsste an dieser Stelle dann sehen, welche Variable das ist. Gruß Bernd
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADwiesel Moderator CAD4FM UG
Beiträge: 1989 Registriert: 05.09.2000 AutoCAD, Bricscad Wir machen das Mögliche unmöglich
|
erstellt am: 11. Jan. 2008 14:15 <-- editieren / zitieren --> Unities abgeben: Nur für Bernd10
dann gib doch eine Liste aller Variablennamen mit deren Werten aus. Allerdings ist dann keine do saubere Programmierung, da die Variablen ja nur wärend der Programmlaufzeit (der unterfunktionen) benutzt werden sollten. Vielleicht musst du vor ende jeder Funktion eine extra Liste mit den Variablennamen und inhalten generieren lassen. Oder gib jeder deiner Funktionen einen Namen, der dann von der Errorfunktion ausgeworfen wird. ------------------ Gruß CADwiesel Besucht uns im CHAT
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bernd10 Mitglied
Beiträge: 763 Registriert: 20.11.2003 Intel(R) Xeon(R) W-2123 CPU @ 3.60GHz 16 GB RAM Windows 10 Pro 64-bit AutoCAD Mechnical 2020 Deu
|
erstellt am: 11. Jan. 2008 15:19 <-- editieren / zitieren --> Unities abgeben:
Hallo CADwiesel, Zitat: Original erstellt von CADwiesel: dann gib doch eine Liste aller Variablennamen mit deren Werten aus. Allerdings ist dann keine do saubere Programmierung, da die Variablen ja nur wärend der Programmlaufzeit (der unterfunktionen) benutzt werden sollten. Vielleicht musst du vor ende jeder Funktion eine extra Liste mit den Variablennamen und inhalten generieren lassen.
meine VLX-Anwendung besteht aus 850 defun-Funktionen. Die darin enthaltene lokale Variablen haben bis auf die der aktuellen defun-Funktion alle den Wert nil. Somit kann ich meine gesuchte Variable von den meisten lokalen Variablen wieder nicht finden. Selbst eine Liste meiner globalen Variablen zu Erstellen wäre mit sehr großem Zeitaufwand verbunden. Es ist aber auf jeden eine Überlegung wert. Zitat: Original erstellt von CADwiesel: Oder gib jeder deiner Funktionen einen Namen, der dann von der Errorfunktion ausgeworfen wird.
Wenn ich die defun-Funktion beim Auftreten des Fehlers ermitteln könnte, wäre mir schon sehr geholfen. Ist das möglich? Oder wie meinst Du genauer mit "jeder deinen Funktionen einen Namen"? Danke im Voraus und viele Grüße Bernd
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 11. Jan. 2008 15:32 <-- editieren / zitieren --> Unities abgeben: Nur für Bernd10
zum Thema Errorhandling hatten wir mal das ... müßtest du aber einpflegen Meine Funktionen laufen im Prinzip so (or(not(vl-catch-all-error-p (vl-catch-all-apply 'FUNKTION (PARAMETERLISTE) ) ) ) (prompt "\nFehler bei Funktion blabla") ) und zu den Variablen guck dir mal die Tutorials vom Axel an .. stichwort : Namespaces
Es geht eben nichts über n sauber strukturiertes Programm mit entsprechend gekapselten Subs ------------------ - 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 |
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: 11. Jan. 2008 19:38 <-- editieren / zitieren --> Unities abgeben: Nur für Bernd10
Vielleicht hilft Dir das: Code: (defun ppp (wert) (prompt (strcat "\n" (symtxt wert) "= ")) (if (= 'STR (type (eval wert))) (princ (strcat "\"" (eval wert) "\"")) (princ (eval wert)) ) (princ) )(defun symtxt (symb / flag str) (setq flag nil) (if (= (type symb) 'SYM) (progn (if (null (eval symb)) (progn (set symb T) (setq flag T) ) ) (setq str (nth (1- (length (member symb (atoms-family 0)))) (reverse (atoms-family 1)))) (if flag (set symb nil)) str ) ) )
Das kannst dann so verwenden: (setq #var1 123) (ppp '#var1) was bewirkt: Befehl: ... . . . #VAR1= 123 Fehlerhafter Argumenttyp: stringp nil ------------------ Schöne Grüße Ernst www.geopaint.at Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bernd10 Mitglied
Beiträge: 763 Registriert: 20.11.2003 Intel(R) Xeon(R) W-2123 CPU @ 3.60GHz 16 GB RAM Windows 10 Pro 64-bit AutoCAD Mechnical 2020 Deu
|
erstellt am: 14. Jan. 2008 07:57 <-- editieren / zitieren --> Unities abgeben:
Hallo Thomas, Zitat: Original erstellt von CADmium: zum Thema Errorhandling hatten wir mal das ... müßtest du aber einpflegenMeine Funktionen laufen im Prinzip so (or(not(vl-catch-all-error-p (vl-catch-all-apply 'FUNKTION (PARAMETERLISTE) ) ) ) (prompt "\nFehler bei Funktion blabla") ) und zu den Variablen guck dir mal die Tutorials vom Axel an .. stichwort : Namespaces
Es geht eben nichts über n sauber strukturiertes Programm mit entsprechend gekapselten Subs
es wird etwas dauern, bis ich mich durch Deine oben genannten Informationen gekämpft habe. Bei Fragen melde ich mich wieder. Danke und viele Grüße Bernd
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bernd10 Mitglied
Beiträge: 763 Registriert: 20.11.2003 Intel(R) Xeon(R) W-2123 CPU @ 3.60GHz 16 GB RAM Windows 10 Pro 64-bit AutoCAD Mechnical 2020 Deu
|
erstellt am: 14. Jan. 2008 08:09 <-- editieren / zitieren --> Unities abgeben:
Hallo Ernst, Zitat: Original erstellt von Geos: Vielleicht hilft Dir das:Code: (defun ppp (wert) (prompt (strcat "\n" (symtxt wert) "= ")) (if (= 'STR (type (eval wert))) (princ (strcat "\"" (eval wert) "\"")) (princ (eval wert)) ) (princ) )(defun symtxt (symb / flag str) (setq flag nil) (if (= (type symb) 'SYM) (progn (if (null (eval symb)) (progn (set symb T) (setq flag T) ) ) (setq str (nth (1- (length (member symb (atoms-family 0)))) (reverse (atoms-family 1)))) (if flag (set symb nil)) str ) ) )
Das kannst dann so verwenden: (setq #var1 123) (ppp '#var1) was bewirkt: Befehl: ... . . . #VAR1= 123 Fehlerhafter Argumenttyp: stringp nil
wenn ich Deinen Vorschlag richtig verstehe, muss ich die Funktion ppp bei jeder Variablen berücksichtigen. Das wäre bei meinen sehr vielen Funktionen und der damit verbundenen hohen Anzahl von Variablen nicht mehr möglich. Falls ich es falsch verstanden habe, kannst Du mir vielleicht genauer erklären, wie ich Deinen Code verwenden muss. Danke im Voraus und viele Grüße Bernd 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: 14. Jan. 2008 08:33 <-- editieren / zitieren --> Unities abgeben: Nur für Bernd10
Hallo Bernd Im Prinzip hast Du's richtig verstanden, aber Du musst ja nicht jede ausdrucken. Bau einige an strategischen Punkten ein - zwischen der letzten ausgedruckten und der ersten nicht ausgedruckten Var. liegt dann der Fehler. Dann könntest Du weiter einschränken. ------------------ Schöne Grüße Ernst www.geopaint.at Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bernd10 Mitglied
Beiträge: 763 Registriert: 20.11.2003 Intel(R) Xeon(R) W-2123 CPU @ 3.60GHz 16 GB RAM Windows 10 Pro 64-bit AutoCAD Mechnical 2020 Deu
|
erstellt am: 14. Jan. 2008 08:42 <-- editieren / zitieren --> Unities abgeben:
Hallo Ernst, Zitat: Original erstellt von Geos: Hallo BerndIm Prinzip hast Du's richtig verstanden, aber Du musst ja nicht jede ausdrucken. Bau einige an strategischen Punkten ein - zwischen der letzten ausgedruckten und der ersten nicht ausgedruckten Var. liegt dann der Fehler. Dann könntest Du weiter einschränken.
das habe ich auf diese Weise schon versucht einzuschränken. Ich habe dabei aber nicht die Variablen, sondern einfach nur eindeutige Meldungen an den strategischen Punkten ausgegeben. Ich konnte die Variable leider trotzdem nicht finden. Danke für Deinen Vorschlag und viele Grüße Bernd
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bernd10 Mitglied
Beiträge: 763 Registriert: 20.11.2003 Intel(R) Xeon(R) W-2123 CPU @ 3.60GHz 16 GB RAM Windows 10 Pro 64-bit AutoCAD Mechnical 2020 Deu
|
erstellt am: 14. Jan. 2008 13:03 <-- editieren / zitieren --> Unities abgeben:
Hallo Thomas, Zitat: Original erstellt von CADmium:
zum Thema Errorhandling hatten wir mal das ... müßtest du aber einpflegen
Einen Errorhandler habe ich schon immer verwendet. Zitat: Original erstellt von CADmium:
Meine Funktionen laufen im Prinzip so (or(not(vl-catch-all-error-p (vl-catch-all-apply 'FUNKTION (PARAMETERLISTE) ) ) ) (prompt "\nFehler bei Funktion blabla") )
Wenn ich Deinen Programmcode richtig verstehe, muss ich das so in jeder meiner Funktionen einbauen. Bei meinen sehr vielen Funktionen wäre das ein großer Aufwand. Zitat: Original erstellt von CADmium:
und zu den Variablen guck dir mal die Tutorials vom Axel an .. stichwort : Namespaces
Ich habe meine Variablen so eingeteilt, dass ich nur folgende Variablen habe: - lokale Variablen - dem Dokument zugeordnete Variablen (vl-doc-set) - der Anwendung zugeordnete Variablen (vl-bb-set) Zitat: Original erstellt von CADmium:
Es geht eben nichts über n sauber strukturiertes Programm mit entsprechend gekapselten Subs
Im Rahmen meiner Kenntnisse habe ich das auch immer versucht. Gruß Bernd
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bernd10 Mitglied
Beiträge: 763 Registriert: 20.11.2003 Intel(R) Xeon(R) W-2123 CPU @ 3.60GHz 16 GB RAM Windows 10 Pro 64-bit AutoCAD Mechnical 2020 Deu
|
erstellt am: 14. Jan. 2008 13:13 <-- editieren / zitieren --> Unities abgeben:
Hallo, im Moment schätze ich den Aufwand entsprechend der oben genannten Informationen sehr hoch ein. Deshlab habe ich mit den Benutzern vereinbart, dass ich meine Anwendung zum Testen so umbaue, dass bei einem Benutzer alle meine Lisp-Funktionen geladen und der Visual Lisp Editor gestartet wird. Dort stelle ich im Menü Debugging auf "Bei Fehler unterbrechen" und somit sollte das Programm beim Aufteten des Fehler angehalten werden. Dann steht das Programm bereits in der gesuchten Funktion und ich kann an dem Arbeitsplatz des Benutzers die Variablen kontrollieren. Das scheint im Moment der Weg mit dem wenigsten Aufwand für mich und nur geringem Umstand für den Benutzer zu sein. Danke noch Mal für die Informationen und viele Grüße Bernd
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 14. Jan. 2008 13:34 <-- editieren / zitieren --> Unities abgeben: Nur für Bernd10
Zitat: Original erstellt von Bernd10: Ich habe meine Variablen so eingeteilt, dass ich nur folgende Variablen habe: - lokale Variablen - dem Dokument zugeordnete Variablen (vl-doc-set) - der Anwendung zugeordnete Variablen (vl-bb-set).
Ich meinte damit eigentlich das
------------------ - 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 |
Bernd10 Mitglied
Beiträge: 763 Registriert: 20.11.2003 Intel(R) Xeon(R) W-2123 CPU @ 3.60GHz 16 GB RAM Windows 10 Pro 64-bit AutoCAD Mechnical 2020 Deu
|
erstellt am: 14. Jan. 2008 14:48 <-- editieren / zitieren --> Unities abgeben:
Hallo Thomas, Zitat: Original erstellt von CADmium: Ich meinte damit eigentlich das
Fehler, die aus der oben angesprochene Problematik entstehen, versuche ich im Prinzip so zu vermeiden, wie im Beitrag unter "Was kann man denn nun tun, um sich vor solchen Fehlern zu schützen?" beschrieben ist: Ich habe mir eine Funktion geschrieben, die mir meine lokalen Variablen in einer Funktion heraus sucht. Dazu habe ich mir einige Voraussetzungen zum Schreiben meiner Lisp-Funktion aufstellen müssen, die ich aber dafür auch einhalte. Notwendige globale Variablen verwende ich nur welche, die mit vl-bb-set oder vl-doc-set geändert werden und zusätzlich mit * am Anfang und Ende gekennzeichnet sind. Keinen Gebrauch mache ich von der Tatsache, dass Variablen auch in Unterfunktionen sichtbar sind. Gruß Bernd
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 14. Jan. 2008 14:54 <-- editieren / zitieren --> Unities abgeben: Nur für Bernd10
Na dann .. Keine Ahnung was du machst, ich (wir) kenne (n) deine Quelltexte nicht! Alle unspezifischen Sachen wurden IMHO erwähnt und Fehlerbeseitigungsmöglichkeiten aufgezeigt. Der Rest liegt nun bei dir! ------------------ - 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 |
Bernd10 Mitglied
Beiträge: 763 Registriert: 20.11.2003 Intel(R) Xeon(R) W-2123 CPU @ 3.60GHz 16 GB RAM Windows 10 Pro 64-bit AutoCAD Mechnical 2020 Deu
|
erstellt am: 14. Jan. 2008 15:03 <-- editieren / zitieren --> Unities abgeben:
Hallo an Alle, Zitat: Original erstellt von CADmium: Na dann .. Keine Ahnung was du machst, ich (wir) kenne (n) deine Quelltexte nicht! Alle unspezifischen Sachen wurden IMHO erwähnt und Fehlerbeseitigungsmöglichkeiten aufgezeigt. Der Rest liegt nun bei dir!
die von euch angesprochnen Informationen sind für mich auch sehr hilfreich. Zum Einen hat es mir gezeigt, dass ich in meiner Programmierung nichts grundsätzlich falsch mache. Zum Anderen hat es mich auf die Idee gebracht, meine Lsp-Dateien beim Benutzer zu verwenden (siehe weiter oben). Damit kann ich die Variable mit dem Wert nil vielleicht finden. Danke für das Interesse und viele Grüße Bernd
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |