Der Code des Programmes dürfte in Teilen so aussehen:
DIM Monatsname(12),letzterTag(12)
REM Monatsnamen und Wert für letzten Tag vergeben
for i=0 to 11
read Monatsname(i),letzterTag(i)
next i
REM Errechnen des nächsten Tages
naechsterTag = aktuellerTag+1
MonatVonNaechsterTag = MonatVonAktuellerTag
MonatsnameVonNaechsterTag = Monatsname(MonatVonNaechsterTag)
JahrVonNaechsterTag = JahrVonAktuellerTag
if (naechsterTag > letzterTag(MonatVonNaechsterTag))
{
naechsterTag = 1
neuerMonat = 1
}
if (neuerMonat == 1 ) GOSUB naechsterMonat
...
END
LABEL naechsterMonat:
MonatVonNaechsterTag = MonatVonNaechsterTag + 1
MonatsnameVonNaechsterTag = Monatsname(MonatVonNaechsterTag)
if (MonatVonNaechsterTag > 10)
{
MonatVonNaechsterTag = 0
neuesJahr = 1
}
if (neuesJahr == 1) GOTO naechstesJahr
neuerMonat = 0
neuesJahr = 0
RETURN
LABEL naechstesJahr:
JahrVonNaechsterTag = JahrVonNaechsterTag + 1
RETURN
Gut, daß ich hier BASIC und C vermischt habe. Das macht den Code
schlechter lesbar als er ohnehin wäre. Der Original-Code dürfte aber
noch schlechter zu lesen und daher zu warten sein.
Die Fehler liegen hier in der SUBROUTINE naechsterMonat:
"if (MonatVonNaechsterTag > 10)" sollte besser "if
(MonatVonNaechsterTag > 11)" heißen und "MonatsnameVonNaechsterTag =
Monatsname(MonatVonNaechsterTag)" sollte erst nach der "if"-Funktion
im Text stehen. So endet das Jahr schon im Novemeber. In früheren
Versionen wird da wahrscheinlich "if (MonatVonNaechsterTag > 11)"
gestanden haben. Da aber bei "MonatsnameVonNaechsterTag =
Monatsname(MonatVonNaechsterTag)" der Wert von "MonatVonNaechsterTag"
den Wert "12" vor der Prüfung haben kann, gibt es hier einen Zugriff
auf ein nicht vorhandenes Feld. Dies wurde durch
"if (MonatVonNaechsterTag > 10)" versucht zu korrigieren. Im
Original-Code wird man wahrscheinlich ein "Array of Elements" oder so
etwas ähnliches haben, wo immer zum neuen Monat auf den naechsten
Eintrag zugegriffen wird und im Anschluß erst geprüft wird, ob dieser
überhaupt existiert.
In "if (neuesJahr == 1) GOTO naechstesJahr" müßte ein "GOSUB" stehen.
So wird sobald "neuesJahr" zum erstenmal den Wert "1" zugewiesen
bekommt, der Teil, wo "neuerMonat = 0" und "neuesJahr = 0" steht nie
mehr erreicht. Daher folgt auf dem 1. Januar 2012 bereits der 2.
Februar 2013 - neuer Tag, neuer Monat und neues Jahr zugleich.
MfG
Guano-User
DIM Monatsname(12),letzterTag(12)
REM Monatsnamen und Wert für letzten Tag vergeben
for i=0 to 11
read Monatsname(i),letzterTag(i)
next i
REM Errechnen des nächsten Tages
naechsterTag = aktuellerTag+1
MonatVonNaechsterTag = MonatVonAktuellerTag
MonatsnameVonNaechsterTag = Monatsname(MonatVonNaechsterTag)
JahrVonNaechsterTag = JahrVonAktuellerTag
if (naechsterTag > letzterTag(MonatVonNaechsterTag))
{
naechsterTag = 1
neuerMonat = 1
}
if (neuerMonat == 1 ) GOSUB naechsterMonat
...
END
LABEL naechsterMonat:
MonatVonNaechsterTag = MonatVonNaechsterTag + 1
MonatsnameVonNaechsterTag = Monatsname(MonatVonNaechsterTag)
if (MonatVonNaechsterTag > 10)
{
MonatVonNaechsterTag = 0
neuesJahr = 1
}
if (neuesJahr == 1) GOTO naechstesJahr
neuerMonat = 0
neuesJahr = 0
RETURN
LABEL naechstesJahr:
JahrVonNaechsterTag = JahrVonNaechsterTag + 1
RETURN
Gut, daß ich hier BASIC und C vermischt habe. Das macht den Code
schlechter lesbar als er ohnehin wäre. Der Original-Code dürfte aber
noch schlechter zu lesen und daher zu warten sein.
Die Fehler liegen hier in der SUBROUTINE naechsterMonat:
"if (MonatVonNaechsterTag > 10)" sollte besser "if
(MonatVonNaechsterTag > 11)" heißen und "MonatsnameVonNaechsterTag =
Monatsname(MonatVonNaechsterTag)" sollte erst nach der "if"-Funktion
im Text stehen. So endet das Jahr schon im Novemeber. In früheren
Versionen wird da wahrscheinlich "if (MonatVonNaechsterTag > 11)"
gestanden haben. Da aber bei "MonatsnameVonNaechsterTag =
Monatsname(MonatVonNaechsterTag)" der Wert von "MonatVonNaechsterTag"
den Wert "12" vor der Prüfung haben kann, gibt es hier einen Zugriff
auf ein nicht vorhandenes Feld. Dies wurde durch
"if (MonatVonNaechsterTag > 10)" versucht zu korrigieren. Im
Original-Code wird man wahrscheinlich ein "Array of Elements" oder so
etwas ähnliches haben, wo immer zum neuen Monat auf den naechsten
Eintrag zugegriffen wird und im Anschluß erst geprüft wird, ob dieser
überhaupt existiert.
In "if (neuesJahr == 1) GOTO naechstesJahr" müßte ein "GOSUB" stehen.
So wird sobald "neuesJahr" zum erstenmal den Wert "1" zugewiesen
bekommt, der Teil, wo "neuerMonat = 0" und "neuesJahr = 0" steht nie
mehr erreicht. Daher folgt auf dem 1. Januar 2012 bereits der 2.
Februar 2013 - neuer Tag, neuer Monat und neues Jahr zugleich.
MfG
Guano-User