Umkehrung einer Procedur

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Maurizio555
Beiträge: 53
Registriert: 03.10.2004 10:00
Wohnort: BW

Umkehrung einer Procedur

Beitrag 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
Mit fernem Wasser läßt sich nicht ein nahes Feuer löschen.
Tsue Hung (525 n.Chr.).
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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....
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Maurizio555
Beiträge: 53
Registriert: 03.10.2004 10:00
Wohnort: BW

Beitrag 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...
Mit fernem Wasser läßt sich nicht ein nahes Feuer löschen.
Tsue Hung (525 n.Chr.).
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag 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
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
Maurizio555
Beiträge: 53
Registriert: 03.10.2004 10:00
Wohnort: BW

Beitrag 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.)?
Mit fernem Wasser läßt sich nicht ein nahes Feuer löschen.
Tsue Hung (525 n.Chr.).
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag 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
NetSlayer
Beiträge: 117
Registriert: 21.09.2004 21:18
Kontaktdaten:

Beitrag 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.
...MfG, NetSlayer
"No, I ain't got a problem. It's you with the problem!"
http://netslayer.scpn.net
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

oder mit dem klassischen $
Benutzeravatar
Creature
Beiträge: 678
Registriert: 29.08.2004 00:55
Wohnort: Frankfurt/Main

Beitrag von Creature »

Kaeru Gaman hat geschrieben:oder mit dem klassischen $
das geht auch?...ah klasse, gut zu wissen. kommt man nicht aus der gewohnheit...
Bildung kommt von Bildschirm und nicht von Buch, sonst hieße es ja Buchung.
Antworten