Roland Goretzki schrieb:
Hast du das Beispiel in dem Kommentar gesehen?
Ja, Du meinst:
i := 1; if StrReadInt (s, i, Size) and StrReadComma (s, i) and ...
Demnach müßte ich also für das 2. Argument die Variable eins einsetzen:
eins := 1; Leistung [eins] := StrReadInt (Leistungs_Zahl [drei], eins, Leistung [eins]);
Das erste Argument ist der String, aus dem ich die Zahl haben möchte. Vielleicht ist das 3. Argument der springende Punkt. Mir ist überhaupt nicht klar, weshalb noch ein 3. Argument gebraucht wird, also auch nicht, was da erwartet wird.
Das 3. Argument ist das Ziel, soweit richtig.
Du wunderst dich vermutlich eher über das 2. Argument. Das ist ein Positionszähler, damit man aus einem String nacheinander mehrere Elemente lesen kann. (Eine Variable mit Wert 1 ist hier richtig, allerdings hat sie nichts mit dem Index vom Leistung zu tun, auch wenn am Anfang beide zufällig gleich 1 sind.)
Oder über den Rückgabewert:
: They return True if successful, False otherwise.
Deshalb klappt die Zuweisung an die Zielvariable nicht.
Falls der String doch noch andere Dinge als Ziffern enthält?
Ja.
Tut er eigentlich nicht ...
Dann kannst du auch einfach "ReadStr" verwenden. Wenn er dann doch etwas anderes enthält, gibt es einen Laufzeitfehler. Je nach Anwendung ist das OK oder nicht ...
So scheint es. Zwar habe ich in einem kleinen Probe-Programm vorhin problemlos gearbeitet, aber mein großes Programm läuft genau dann nicht mehr, wenn ich die Zeile mit Str2Int einkommentiere, obwohl bei der Übersetzung nichts beanstandet wird (Das ist ja wohl en Laufzeitfehler, oder?).
Was heißt, es läuft nicht mehr?
Laufzeitfehler sehen so ähnlich aus:
foo: sign or digit expected (error #552 at 804a0b6)
Wenn es immer noch um das CGI-Programm geht, sieht man im Browser nur einen internen Fehler (500 oder so), wenn das Progrmam vorzeitig abbricht. Die genaue Fehlermeldung findet man ggf. im Server-Logfile.
Bevor ich hier um Rat gefragt habe, hätte ich beinahe den String in eine Datei geschrieben und mit ReadLn wieder eingelesen, was meiner Meinung nach auch eine sichere Möglichkeit ist, aber natürlich umständlich und nicht "elegant".
Nein, nicht sehr elegant. ;-) Aber "ReadStr" macht fast genau das Gleiche (nur eleganter).
Oder gibt es dabei auch die Möglichkeit mit dem Laufzeitfehler?
Natürlich. Alle Dateioperationen können Laufzeitfehler verursachen (aus diversen Gründen).
Das grundsätzliche Problem in allen Fällen ist, dass String->Integer-Umwandlung prinzipiell Fehler verursachen kann (während Integer->String immer geht, vorausgesetzt der String ist groß genug). Deshalb muss man die Fehler entweder abfragen (Rückgabewert und Position von StrReadInt bzw. 3. Argument von "Val") und im Fehlerfall irgendwas machen (oder auch gar nichts, indem man den Wert einfach ignoriert; nur ist das Programm dann nicht so robust) oder lässt einen Laufzeitfehler auftreten ("ReadStr" ohne weitere Maßnahmen).
Frank