Seite 1 von 1

ProcedureReturn

Verfasst: 27.02.2006 03:48
von NicTheQuick
Ohne viel Erklärung.

Dieser Code funktioniert:

Code: Alles auswählen

Procedure jultag_SK(y.l, m.l)
  If m > 2
    If y % 400 = 0
      ProcedureReturn 1
    ElseIf y % 4 = 0 And y % 100
      ProcedureReturn 1
    EndIf
  EndIf
  ProcedureReturn 0
EndProcedure

Procedure.l jultag_MK(m.l)
  Protected r.l
  
  Select m
    Case 1, 4, 5 : r = -1
    Case 2, 6, 7 : r = 0
    Case 3 : r = -2
    Case 8 : r = 1
    Case 9, 10 : r = 2
    Case 11 : r = 3
  EndSelect
  
  ProcedureReturn r
EndProcedure

Procedure jultag_LT(y.l, m.l, d.l)
  Protected r.l
  r = jultag_MK(m)
  ProcedureReturn d + 30 * (m - 1) + jultag_SK(y, m) + r
EndProcedure

Debug jultag_LT(1917, 10, 25)
Dieser hier nicht. Er gibt etwas falsches aus:

Code: Alles auswählen

Procedure jultag_SK(y.l, m.l)
  If m > 2
    If y % 400 = 0
      ProcedureReturn 1
    ElseIf y % 4 = 0 And y % 100
      ProcedureReturn 1
    EndIf
  EndIf
  ProcedureReturn 0
EndProcedure

Procedure.l jultag_MK(m.l)
  Protected r.l
  
  Select m
    Case 1, 4, 5 : r = -1
    Case 2, 6, 7 : r = 0
    Case 3 : r = -2
    Case 8 : r = 1
    Case 9, 10 : r = 2
    Case 11 : r = 3
  EndSelect
  
  ProcedureReturn r
EndProcedure

Procedure jultag_LT(y.l, m.l, d.l)
  ProcedureReturn d + 30 * (m - 1) + jultag_SK(y, m) + jultag_MK(m)
EndProcedure

Debug jultag_LT(1917, 10, 25)
So gehts übrigens genauso wenig:

Code: Alles auswählen

;Code von oben
Procedure jultag_LT(y.l, m.l, d.l)
  Protected r.l
  r = d + 30 * (m - 1) + jultag_SK(y, m) + jultag_MK(m)
  ProcedureReturn r
EndProcedure
Ich bitte um Bestätigung!

Verfasst: 27.02.2006 04:11
von Toshy
Was soll der Code denn genau machen?
So ganz 100%ig habe ich es nicht verstanden oder der Code läuft noch nicht richtig.

Und was läuft bei dir nicht?
Aber mal als Hinweis, ich habe auch schon mitbekommen das "ProcedureReturn" nicht immer richtig funktioniert. Das wurde hier und im englischen Forum schon bestätigt, vielleicht hat es damit was zu tun.

[edit]
Ich kann aber bestätigen, das Procedurereturn bei dem code den du als "flasches Ergebnis" bezeichnst nicht den Wert zurückgibt, den es müßte.
Wir mit dem Bug zusammenhängen, der auch bei Newlist und einigen anderen Dingen auftritt.
Warten wir mal die Beta5 ab.

Verfasst: 27.02.2006 05:16
von NicTheQuick
Aha, ok!
Das wird wohl an dem ProcedureReturn liegen.

Gut, damit wäre das dann auch erledigt.

Verfasst: 27.02.2006 14:07
von Lebostein
@Nick: Ich hab mal dein Beispiel bis auf den Fehler heruntergebrochen. Es scheint an dem Case-Befehl in Verbindung mit Procedurereturn zu liegen:

Code: Alles auswählen

Procedure.l b()
  Select 10
    Case 10
  EndSelect
  ProcedureReturn 2
EndProcedure

m = 10
b = b()

Debug 2   ; = 2
Debug b   ; = 2
Debug b() ; = 2

Debug 30 * (m - 1) + 2   ; = 272
Debug 30 * (m - 1) + b   ; = 272
Debug 30 * (m - 1) + b() ; = 12 !!! solte auch 272 sein !!!
Und wenn man im Case-Befehl den Wert z.B. auf 20 ändert, dann passiert folgendes eigenartiges:

Code: Alles auswählen

Procedure.l b()
  Select 20
    Case 20
  EndSelect
  ProcedureReturn 2
EndProcedure

m = 10
b = b()

Debug 2   ; = 2
Debug b   ; = 2
Debug b() ; = 2

Debug 30 * (m - 1) + 2   ; = 272
Debug 30 * (m - 1) + b   ; = 272
Debug 30 * (m - 1) + b() ; = 22 !!! solte auch 272 sein !!!

Verfasst: 28.02.2006 18:02
von Toshy
Laut Fred ist der Fehler behoben.
Warten wir mal auf die nächste Beta.
Gruß
Toshy