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
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
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

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.

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.