Seite 1 von 1

Zeitdifferenz berechnen

Verfasst: 21.03.2009 10:48
von Little John
xxx

Verfasst: 21.03.2009 13:28
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.

Verfasst: 21.03.2009 13:44
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

Verfasst: 21.03.2009 13:54
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...

Verfasst: 21.03.2009 13:55
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.

Verfasst: 21.03.2009 14:02
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:

Verfasst: 21.03.2009 14:07
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.

Verfasst: 21.03.2009 14:14
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:

Verfasst: 21.03.2009 14:16
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.