Seite 1 von 2
Umkehrung einer Procedur
Verfasst: 09.12.2004 21:44
von Maurizio555
Hallo!
Ist einer von Euch fit in Mathe?
Diese Procedur erwartet d (Tag), m (Monat), y (Jahr) und gibt eine Long Zahl zurück. Diese stellt eine Fortlaufende Nummer dar, die sich Tag für Tag um 1 erhöht. Damit kann ich Zeitrechnungen anstellen, ohne die Einschränkungen des Unixsystems (also auch 785 v.C. und 5304 n.C.).
Weiss jemand wie man die Procedure umkehren kann, also so daß man die Longnummer übergibt und d, m, y zurückbekommt? (ich weiss, eine Procedur kann nur eine Var zurückgeben, mir reicht es, wenn sie in 3 Globals die Werte schreibt).
Ich habe es lange versucht, außer schlimme Kopfschmerzen und 2 Aspirinen weniger ist nichts dabei herrausgekommen...
Code: Alles auswählen
Procedure.l FortlaufKal(d.b, m.w, y.w)
If m.w <3
y.w=y-1
m.w=m+12
EndIf
a.w=Int(y/100)
b=2-a+Int(a/4)
zahl.l=Int(365.25*(y+4716))+Int(30.6001*(m+1))+d+b-1524
ProcedureReturn zahl
EndProcedure
Verfasst: 09.12.2004 21:48
von Kaeru Gaman
liefert die denn überhaupt genaue ergebnisse?
du hast da nachkommastellen für tage pro jahr und tage pro monat...
also, ich denke, das stimmt hinten und vorne nicht, sorry.
ausserdem ist zwar jedes durch vier teilbare jahr ein schaltjahr,
jedes durch hundert teilbare jahr allerdings nicht.
PS: google mal nach 'julianisches datum'
hab ich ne menge treffer....
Verfasst: 09.12.2004 22:02
von Maurizio555
Die Algorithmen sind (leider) nicht von mir, sondern von einem Mathematiker. Sie liefern genaue ergebnisse und berücksichtigen alles, von den Schaltjahre bis zur Gregorianische Kalender-Reform!
Probier es einfach aus...
Verfasst: 09.12.2004 22:09
von Kaeru Gaman
ok, sorry, ich hab nicht genau hingesehen...
ist das vielleicht sogar die julianische formel?
schau doch mal auf den zugehörigen pages, da sind auch einige von unis dabei.
vielleicht findest du da direkt nen algo zum zurückrechnen.
Verfasst: 10.12.2004 00:05
von Falko
@Maurizio555
Hab was dazu gefunden und angepasst. Ich hoffe es ist soweit
i.O.
MFG Falko
Code: Alles auswählen
;Formel entnommen von
; http://www.ortelius.de/kalender/calc_de.php
;Angepasst von Falko
Procedure.l FortlaufKal(d.b, m.w, y.w)
If m.w <3
y.w=y-1
m.w=m+12
EndIf
a.w=Int(y/100)
b=2-a+Int(a/4)
zahl.l=Int(365.25*(y+4716))+Int(30.6001*(m+1))+d+b-1524
ProcedureReturn zahl
EndProcedure
LANG.l=FortlaufKal(9,12,2004)
Debug LANG
;
Procedure DMY(JD.l)
Global T.b,M.w,J.w
N1 = JD + 32044
N2 = N1 / 146097
N3 = N1 % 146097
N4 = N3 / 36524 - N3 / 146096
N5 = N3 - 36524*N4
N6 = N5 / 1461
N7 = N5 % 1461
N8 = N7 / 365 - N7 / 1460
N9 = N7 - 365*N8
N10 = (111*N9 + 41) / 3395
T = N9-30*N10-(7*(N10 + 1)) / 12 + 1
M1 = N10 + 3
J1 = 400*N2+100*N4+4*N6+N8-4800
M = ((M1 + 11) % 12)+1
J = J1+(M1 / 13)
EndProcedure
DMY(LANG)
Debug T
Debug M
Debug J
Verfasst: 10.12.2004 21:27
von Maurizio555
Vielen Dank, es funzt.
Ich habe nebenbei noch ne' Frage: welchen Variablentyp nimmt eine Variable in PB an, wenn man sie ohne .Typ (on the fly)deklariert (so wie in deinem Beispielcode N1 usw.)?
Verfasst: 10.12.2004 21:35
von Zaphod
eine variable, die man "on the fly" deklariert ohne den typ anzugeben, nimmt entweder den typ an, den man ihr als erstes impliziert zuweist oder den typ, der per deftype als default vorgegeben wurde.
beispiel
myvar = 1 ; dadurch wird myvar vom typ long
myvar2 = 1.04 ; dadurch wird myvar2 vom typ float
myvar3 = "lulubulu" ; ; dadurch wird myvar3 vom typ string
; per default angabe
Deftype.w a,b,c,d
; a,b,c,d haben den typ word
Verfasst: 11.12.2004 00:45
von NetSlayer
Zaphod hat geschrieben:myvar3 = "lulubulu" ; ; dadurch wird myvar3 vom typ string
IMHO stimmt das so nicht, denn der Standard-Typ für Variablen ist in PureBasic Long, und den Compiler interessiert es herzlich wenig, was du da versuchst reinzuschreiben: er steigt einfach aus. Musst du also mit .s angeben.
Verfasst: 11.12.2004 01:57
von Kaeru Gaman
oder mit dem klassischen $
Verfasst: 11.12.2004 02:09
von Creature
Kaeru Gaman hat geschrieben:oder mit dem klassischen $
das geht auch?...ah klasse, gut zu wissen. kommt man nicht aus der gewohnheit...