Zeitdifferenz berechnen

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Little John

Zeitdifferenz berechnen

Beitrag von Little John »

xxx
Zuletzt geändert von Little John am 07.05.2010 01:33, insgesamt 1-mal geändert.
Benutzeravatar
X0r
Beiträge: 2770
Registriert: 15.03.2007 21:47
Kontaktdaten:

Beitrag von X0r »

Mal ne Frage, wäre das hier nicht eleganter:

Code: Alles auswählen

; Zeitpunkt
Structure DateTime
  year.w
  month.b
  day.b
  hour.b
  min.b
  sec.b
EndStructure

; Zeitspanne
Structure TimeSpan
  days.i
  hours.b
  minutes.b
  seconds.b
EndStructure

Procedure.i TimeDiff (*begin.DateTime, *finish.DateTime)
  ; in : begin : Anfangszeitpunkt
  ;      finish: Endzeitpunkt
  ; out: Pointer auf Zeitspanne zwischen 'begin' und 'finish'
  ;      (in Tagen, Stunden, Minuten, Sekunden)

  Protected b, f, elapsed
  *diff.TimeSpan=HeapAlloc_(GetProcessHeap_(),$00000008 ,SizeOf(TimeSpan))

  
  With *begin
    b = Date(\year, \month, \day, \hour, \min, \sec)
  EndWith
  With *finish
    f = Date(\year, \month, \day, \hour, \min, \sec)
  EndWith
  elapsed = f - b
  
  With *diff
    \seconds = elapsed % 60
    elapsed  = Int(elapsed/60)
    \minutes = elapsed % 60
    elapsed  = Int(elapsed/60)
    \hours   = elapsed % 60
    \days    = Int(elapsed/24)
  EndWith
  
  ProcedureReturn *diff
EndProcedure


;-- Demo
Define start.DateTime, ende.DateTime, *differenz.TimeSpan

With start
  \year  = 2006
  \month = 3
  \day   = 20
  \hour  = 22
  \min   = 0
  \sec   = 0
EndWith

With ende
  \year  = 2009
  \month = 3
  \day   = 21
  \hour  = 6
  \min   = 30
  \sec   = 0
EndWith

*differenz = TimeDiff(start, ende)

Debug "Die Nachtschicht dauerte:"
With *differenz
  Debug Str(\days) + " Tage, " + Str(\hours) + " Stunden, " + Str(\minutes) + " Minuten, " + Str(\seconds) + " Sekunden."
EndWith
Sowas über Static zu lösen sehe ich selten.
Little John

Beitrag von Little John »

X0r hat geschrieben:Mal ne Frage, wäre das hier nicht eleganter:
Danke, dass ich erstmal selbst suchen darf, wo der Unterschied ist ...

... und zwar hier:

Little John

Code: Alles auswählen

Static diff.TimeSpan
X0r

Code: Alles auswählen

*diff.TimeSpan=HeapAlloc_(GetProcessHeap_(),$00000008 ,SizeOf(TimeSpan))
... und dementsprechend natürlich weiterhin in der Procedure *diff statt diff u.ä.

Warum soll das eleganter sein? Jedenfalls ist es nicht mehr cross-platform.

Gruß, Little John
Benutzeravatar
X0r
Beiträge: 2770
Registriert: 15.03.2007 21:47
Kontaktdaten:

Beitrag von X0r »

>Warum soll das eleganter sein?
Na ob es wirklich eleganter ist, kann man glaube ich nicht so direkt sagen. Aber dass man static benutzt, um ein objekt zurückzugeben, sehe ich zum 1. mal.
Muss ja nicht heißen, dass es besser ist...
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

> Mal ne Frage, wäre das hier nicht eleganter:
Kommt drauf an, wieviel Berechnungen man macht bis der Speicher Weg ist :mrgreen:

1: gibts AllocateMemory, dann bleibt es Crossplattform.
2: sollte man, wenn man es so macht, den Speicher auch wieder freigeben.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
X0r
Beiträge: 2770
Registriert: 15.03.2007 21:47
Kontaktdaten:

Beitrag von X0r »

>sollte man, wenn man es so macht, den Speicher auch wieder freigeben.
Ne, dann kann mans bei dieser Kleinigkeit gleich sein lassen. Außerdem, ein richtiges OS organisiert den Speicher nach Programm-Ende wieder neu..
Heißt nicht, dass man allokierten Speicher nie freigeben sollte, aber bei sowas...
Kommt aber natürlich drauf an, was man mit dieser Funktion alles macht :mrgreen:
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Dir ist aber klar, das Du mit jedem Aufruf erneut Speicher reservierst?
Da ist die Lösung mit der Static Variable aber wesentlich eleganter und
performanter.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
X0r
Beiträge: 2770
Registriert: 15.03.2007 21:47
Kontaktdaten:

Beitrag von X0r »

>Dir ist aber klar, das Du mit jedem Aufruf erneut Speicher reservierst?
Ja..
In diesem Fall ist static dann doch wohl besser. Sehe sowas zwar selten aber ok. Den Speicher dann noch wieder freigeben...da kann mans doch gleich lassen. :mrgreen:
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

>> das Du mit jedem Aufruf erneut Speicher reservierst?

muss ihm wohl entgangen sein.... sträfliches Leak dieses...


Static ist eine ganz nette Sache für sowas, vermeidet Global, damit keine andere Routine drin Rumpfuschen kann.

Man kann natürlich auch Mem allocieren, dann braucht man aber den pointer dahin static, kommt also fast aufs selbe raus.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten