Hallo Liste, hallo Frank,
der Fehler lag in der falschen Deklaration einer Variablen, die nicht Integer, sondern LongInt sein mußte:
Ist so etwas auch ein Laufzeitfehler?
Jedenfalls hätte ich ohne den Austausch hier den Fehler wohl kaum finden können: Erst bei dem Versuch, genauer zu beschreiben, was alles vor sich geht und "richtig" sein müßte, fiel er mir dann auch nur "zufällig" auf.
Pascal ist schon eine tolle Sprache, und in den letzten Wochen habe ich für meine Verhältnisse sehr viel dazugelernt.
Das folgende zu lesen ist nicht mehr unbedingt notwendig, ich gebe es nur wieder, weil ich hier "so viel Wind" gemacht habe und falls es jemanden interessiert, wie man bei dem Versuch, in einer E-Mail alles möglichst genau zu beschreiben, den "Knackpunkt" finden kann, und weil es noch einige Ungereimtheiten bezüglich StrReadInt enthält, was ich aber nun (zumindest vorläufig) gar nicht benutze.
Herzlichen Dank und Fröhliche Grüße Roland
Du schriebst:
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.
Das heißt, daß dort genau dasselbe stehen muß wie das, dem ich es zuweisen möchte? Klingt merkwürdig, habe ich aber im obigen Beispiel probiert, weil mir nichts Besseres einfiel.
Du wunderst dich vermutlich eher über das 2. Argument.
Nein, nach dem gründlicheren Studium der Funktion ist mir das mit dem Positionszähler schon einigermaßen klar geworden.
Wenn ich die obige Zeile:
Leistung [eins] := StrReadInt (Leistungs_Zahl [drei], eins, Leistung [eins]);
so schreibe:
Leistung [1] := StrReadInt (Leistungs_Zahl [drei], eins, Leistung [1]);
dann müßte es klarer sein. Aber auch dann heißt es: "incompatible types in assignment". Was ist denn da noch falsch?
Oder über den Rückgabewert:
: They return True if successful, False otherwise.
Deshalb klappt die Zuweisung an die Zielvariable nicht.
Es gibt ja gar keinen Rückgabewert, nur die obige Fehlermeldung. Oder bedeutet diese Fehlermeldung schon ein "return False"?
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.
Nein, es stürzt nicht ab. Nur wird die html-Ausgabe nicht mehr vollständig aufgebaut, d.h. ich bekomme nicht das, was ich wollte, sondern er schreibt ab einem gewissen Punkt den html-Code nicht mehr weiter.
... Nachseh-Pause ... ;-)
Nun habe ich das mal genauer geprüft: Die Zeile mit dem ReadStr steht in einer Prozedur namens "Best_Leistung", welche wiederum aufgerufen wird in einer Prozedur namens "Auswertung", und diese wird in einer Prozedur namens "AufgabenAusgeben" aufgerufen.
Diese letzte Prozedur (AufgabenAusgeben) wird immer mit aufgerufen, wenn der Benutzer eine Eingabe gemacht hat. Sie dient in erster Linie dazu, den Bildschirm mit den gewünschten Veränderungen neu aufzubauen.
Und genau da, wo die "Best_Leistung" aufgerufen wird, hört der Bildschirmaufbau auf.
Zur noch genaueren Prüfung habe ich mal etwas in eine Probedatei geschrieben::
Append (ProbeDat, '../test/LST/die-Sitzungen/probe.txt'); WriteLn (ProbeDat, Rekord_Datum); Close (ProbeDat);
ReadStr (Rekord_Datum, Das_Rekord_Datum);
Das funktioniert, wenn ich die Datei VOR der ReadStr-Anweisung beschreibe.
Es findet kein weiterer Schreibvorgang statt, wenn ich die Datei NACH der ReadStr-Anweisung beschreiben will.
An der Variable "Rekord_Datum" kann es nicht liegen, denn die wird ja geschrieben, wenn ich sie VOR der ReadStr-Anweisung schreiben lasse.
Sie enthält übrigens den String mit der Zahl der "GetMicroSecondTime"-Zeit der ermittelten bisherigen Bestleistung.
Das funktioniert auch alles bestens. Nur will ich diesen String durch die Prozedur "Zeit_Komponenten_Ausgabe" laufen lassen, deshalb muß sie nach Integer verwandelt werden ...
UUpps: Dabei ist mir aufgefallen, daß ich die Variable "Das_Rekord_Datum" als Integer deklariert hatte, aber sie muß natürlich LongInt sein.
Ohne den Versuch, das alles hier zu beschreiben, wäre mir das wohl kaum aufgefallen. :-)
Nun läßt sich die Probedatei auch NACH der ReadStr-Anweisung beschreiben, und auch alles andere funktioniert wieder einwandfrei.