Ansicht umschalten
Avatar von Guano-User
  • Guano-User

mehr als 1000 Beiträge seit 12.09.2007

Wieviele Schaltjahre hat das Google-Jahrhundert ?!

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

Bewerten
- +
Ansicht umschalten