Code: Alles auswählen
***********************************************************************************************
** Objekt BetriebsZeit: [Zeichen]
** Variablen:
** Name Typ Startwert
** letzterStart [Zeit] ZEIT
** aktuelle [Zeit]
** gesamt [Zeit] 0:0:0,00000000000001 wenn noch nicht persistent angelegt
** jetzt [Zeit]
** u [Uhr ]
** i [Zahl](Integer) 0
** r [Zahl](Real) 0,000000000000000000
** VZ [Zeichen] +
** PIN [Zeichen] ****
**
** "BetriebsZeit.gesamt"
** ist quasi der Betriebsstundenzähler dieses Programms und wird als persistenter Wert gehalten.
**
** *INIT muss
** BetriebsZeit.gesamt laden und dann
** BetriebsZeit aufrufen!
**
** *END muss ebenfalls
** BetriebsZeit aufrufen und dann
** BetriebsZeit.gesamt speichern!
**
Code: Alles auswählen
** Falls man erlauben will, dass die Betriebszeit zurückgesetzt werden kann:
****************************************************************************
wenn BetriebsZeit = PIN dann
gesamt := 0
letzterStart:= ZEIT
endewenn
****************************************************************************
jetzt := ZEIT
** aktuelle := jetzt - letzterStart
** gesamt := gesamt + aktuelle
gesamt := gesamt + (jetzt - letzterStart)
letzterStart := jetzt
************************************************************************
** allgem. Lösung für formatierte Ausgabe einer Zeitdifferenz (auch < 0)
************************************************************************
r:= gesamt
wenn r < 0 dann
**** r := -r <-- Bug, geht net!
r := 0-r
VZ:= "-"
sonst
VZ:= ""
endewenn
u:= r
i:= r - 0,5
Betriebszeit:= VZ + i + " Tage " + u
Aufgrund eines "sehr originellen" undokumentierten System-Features kann man Zeitvariable nicht mit exakt 0 vorbelegen! In dem Fall, oder bei Eingabe von ungültigen Werten, werden die Variablen mit der Startzeit des Systems initialisiert!!! Zur Verdeutlichung, wenn dies vom Programm auch erwartet wird, kann man dann z.B. ZEIT (oder INSANE oder BRAINDAMAGED) als Startwert eintragen, was - sinnigerweise ohne jeglichen Compilerkommentar - als ungültiger Startwert betrachtet wird. Dadurch wird die Variable aber dann irrerweise tatsächlich mit ZEIT initialisiert.
Da Zeit-Variablen eigentlich "type-gecastete" Real-Variablen sind, (bei denen 1 Tag dem Wert 1,0 entspricht,) kann mann diese auch mit Sekunden-Bruchteilen initialisieren. Z.B. 0:0:0,00000000000001. Das sind 10 Femto-Sekunden! Noch mehr Nullen hinter dem Komma sind wegen der Begrenzung auf 20 Zeichen an dieser Stelle nicht möglich. Ansonsten wären noch ETLICHE Zehnerpotenzen weniger möglich, da Real-Variablen im PC-üblichen Format einen Wertebereich von rund 1*10^±300 haben. Mit der Exponentialschreibweise von Real-Konstanten kommt der Compiler allerdings eh nicht klar.
Irrtümlich hatte ich statt des Funktionsaufrufs ZEIT Anfangs (DATUM+UHRZEIT) verwendet. Dadurch ergab sich beim erstmaligen Aufruf des Makros der kuriose Effekt, dass die aktuelle Laufzeit als (DATUM+UHRZEIT)-ZEIT immer knapp 24 Stunden ergab - und eben nicht 0, wie ursprünglich angenommen.
Grund1: UHRZEIT liefert die Zeit auf glatte, ohne Rest durch 5 teilbare Sekunden, während ZEIT die aktuelle Zeit auf Sekundenbruchteile genau liefert, so dass sich immer eine Differenz bis zu 5 Sekunden ergibt.
Grund2: Ein weiteres undokumentiertes Kuriosum ist, dass man bei der Subtraktion von Zeitwerten keine negativen Werte erhält, sondern immer nur Modulo 24 Stunden! -3 Sekunden werden dabei zu "23:59:57"! Die Addition und Subtraktion von Zeitwerten verhält sich also nicht symmetrisch, allerdings erst, wenn das Ergebnis negativ würde. Das ist nicht gerade das, was ein "normaler" Mensch erwartet, zumal wenn dieses "Feature" auch noch undokumentiert ist. Wenn man dieses "Feature" abschalten will, muss man Zeitwerte als Real-Werte verarbeiten. Da gelten die normalen Additions- und Subtraktionsregeln und nur damit kann man auch negative Zeitwerte erhalten.
Anders ausgedrückt, hat man hier also zwei unterschiedliche "-" Operatoren für Zahlen und Zeit-Operanden, während sich der "+" Operator bei beiden Operanden-Typen gleich verhält. Egal ob ich die Operanden als Real- oder Zeit-Werte addiere. Da in diesem "System" aber auch gemischte Operanden zulässig sind, wie "Zeitvariable:= Zeitvariable-1,0", lässt sich kaum voraussagen, welchen "-" Operator der Compiler wohl verwenden wird oder ob er (kommentarlos!) überhaupt keinen Code erzeugt, was oft genug vorkommt!
Da UHRZEIT auf glatte 5 Sekunden abgerundet ist, müsste
Code: Alles auswählen
ZEIT - (DATUM+UHRZEIT) zwischen "00:00:00" und "00:00:05"
(DATUM+UHRZEIT) - ZEIT zwischen "23:59:55" und "23:59:59,999..."