Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  Anfänger-Code mit unsichtbarem Problem

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:  Anfänger-Code mit unsichtbarem Problem (1238 mal gelesen)
autocart
Mitglied
Technischer Redakteur


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

Beiträge: 695
Registriert: 08.09.2003

erstellt am: 20. Jul. 2004 10:12    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

Hallo, folgender Code funktioniert bei mir nicht:
;Code soll prüfen, ob eine Zeichenkette Umlaute oder ß enthält

(defun Umlautß-Pruefung (string01 / äs ös üs ßs)
  (setq äs 0 ös 0 üs 0 ßs 0)
  (repeat (strlen string01)
    (cond
      ((equal "ä" (substr string01 1 1))
        (setq äs (1+ äs))
      )
      ((equal "ö" (substr string01 1 1))
        (setq ös (1+ ös))
      )
      ((equal "ü" (substr string01 1 1))
        (setq üs (1+ üs))
      )
      ((equal "ß" (substr string01 1 1))
        (setq ßs (1+ ßs))
      )
    )
    (setq string01 (substr string01 1))
  )
  (princ (strcat "\nä:" (itoa äs) " ö:" (itoa ös) " ü:" (itoa üs) " ß:" (itoa ßs)))
)

Bei Eingabe von in der Konsole:
(Umlautß-Pruefung "däkösüdße")

gibt Lisp in der Konsole zurück:
ä:0 ö:0 ü:0 ß:0"\nä:0 ö:0 ü:0 ß:0"

Hat jemand eine Ahnung, welchen Fehler ich im Code habe?
Danke, Stephan acart

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

CADmium
Moderator
Maschinenbaukonstrukteur




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

Beiträge: 13508
Registriert: 30.11.2003

.

erstellt am: 20. Jul. 2004 10:18    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 autocart 10 Unities + Antwort hilfreich

Ersetze mal
(setq string01 (substr string01 1))
durch
(setq string01 (substr string01 2))


------------------
- Thomas -

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

autocart
Mitglied
Technischer Redakteur


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

Beiträge: 695
Registriert: 08.09.2003

erstellt am: 20. Jul. 2004 10:53    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

Danke! Super!
Ich bin auch ganz schön blind. Diesen Fehler hatte ich schon einmal bei einem anderen Übungscode von mir.
Jetzt schreibt princ bei (Umlautß-Pruefung "däkösüdße") folgendes:

ä:1 ö:1 ü:1 ß:1"\nä:1 ö:1 ü:1 ß:1"

Weiß jemand auch noch, warum das doppelt "geprinct" wird?
Gruß, Stephan acart

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

CADmium
Moderator
Maschinenbaukonstrukteur




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

Beiträge: 13508
Registriert: 30.11.2003

.

erstellt am: 20. Jul. 2004 10:57    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 autocart 10 Unities + Antwort hilfreich

"geprinct" wird es nur einmal. Das andere ist der Rückgabewert der Funktion.

kannste abstellen durch ein (princ) als letzte Anweisung:
(defun ........
....
....
  (princ)
)

------------------
- Thomas -

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

autocart
Mitglied
Technischer Redakteur


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

Beiträge: 695
Registriert: 08.09.2003

erstellt am: 20. Jul. 2004 11:12    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

<schlag' mir mit flacher Hand auf Kopf> "patsch"
Danke! Wieder Super! 
Ich könnte mir in den Hintern beißen. Anscheinend ist mein Hirn heute noch nicht richtig in Schwung gekommen.
Was täte ich nur ohne cad.de, CADmium und allen anderen, die sich die Köpfe für die Fragenden zerbrechen!
Danke, danke, danke. Die Welt ist wieder in Ordnung.   
Stephan, acart

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

mapcar
Mitglied
CADmin



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

Beiträge: 1250
Registriert: 20.05.2002

Time flies like an arrow, fruit flies like a banana (Groucho Marx)

erstellt am: 20. Jul. 2004 14:28    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 autocart 10 Unities + Antwort hilfreich

Zitat:
Original erstellt von CADmium:
"geprinct" wird es nur einmal. Das andere ist der Rückgabewert der Funktion.

kannste abstellen durch ein (princ) als letzte Anweisung:
(defun ........
....
....
  (princ)
)


Ich kann mal wieder nicht mitlesen, ohne zu intervenieren. Hier wird schon wieder ein Anfänger auf die 'schiefe Bahn' gebracht und zur kriminellen Programmierung angeleitet!

Autocart, streich einfach beide princs wieder raus - die letzte Zeile der Funktion sieht dann so aus:

Code:

  ...
  (strcat"\nä:"(itoa äs)" ö:"(itoa ös)"ü:"(itoa üs)" ß:"(itoa ßs))
)

Dann macht die Funktion auch genau das, was du im Augenblick willst, nämlich das Ergebnis einmal in die Befehlszeile schreiben. Und so bleibt die Funktion eine Funktion, die eine Rückgabe hat. Mit einem (princ) am Ende wird eine Funktion in ihrer Eigenschaft als Funktion zerstört, sie hat keine Rückgabe mehr.

Das bedeutet: Als Funktion kannst du z.B. die Ergebnisse an eine andere Funktion weitergeben, hier ein Beispiel:

Code:

(defun zaehle-umlaute-in-datei(string01 dateiname / fh)
  (if(setq fh(open dateiname "a"))
    (progn
      (write-line(Umlautß-Pruefung string01)fh)
      (close fh)
    )
  )
)

Jedwede Möglichkeit, die Funktion für so etwas (und anderes) zu nutzen, nimmt man sich, wenn man die Rückgabe kastriert. In diesem Fall würde das Programm mit der kastrierten Version einen Fehler verursachen.

Die goldene Regel ist einfach erklärt: In einer Funktion, die irgendetwas berechnet oder irgendwas in der Geometriedatenbank sucht oder erzeugt oder ändert, gehört niemals ein princ, print o.ä. hinein. Die Ein- und Ausgabefunktionen gehören ausschließlich in Funktionen, die das User Interface darstellen, und das leere (princ) gehört ausschließlich ans Ende eines mit dem Präfix c: definierten neuen AutoCAD-Befehls - die c:-Funktion sollte auch hier das User Interface sein und dann die 'eigentlichen' Funktionen aufrufen.

Gruß, Axel Strube-Zettler

------------------

Meine AutoLisp-Seiten
Meine private Homepage
Mein Angriff auf dein Zwerchfell
Mein Lexikon der Fotografie
Mein gereimtes Gesülze

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

CADmium
Moderator
Maschinenbaukonstrukteur




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

Beiträge: 13508
Registriert: 30.11.2003

.

erstellt am: 20. Jul. 2004 14:47    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 autocart 10 Unities + Antwort hilfreich

@Axel: Ich stimme dir ja voll und ganz zu! Aber ich wollte wirklich nur die gestellte Frage beantworten. Das man die Umlautprüfung auch noch eleganter hinkriegt steht sowieso auf einem anderen Blatt!

@All : Also Leuts: Auf Dauer ist ein gewisser Programmierstil wichtig!
Nach einer gewissen Ausprobierphase solltet ihr euch wirklich
diese Seiten zu Gemüte führen.

------------------
- Thomas -

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