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.
Frogger
Beiträge: 425 Registriert: 14.03.2006 19:27
Kontaktdaten:
Beitrag
von Frogger » 02.09.2006 21:48
Code: Alles auswählen
;PB 400
Procedure.s SecToTime(sec.l) ;Rückgabewert ist ein string in dieser Form hh:mm.ss
Protected stunden.l, minuten.l, sekunden.l
Protected hh.s, mm.s, ss.s
minuten = sec/60
sekunden = sec-(minuten*60)
stunden = minuten/60
minuten = minuten-(stunden*60)
hh = Str(stunden)
mm = Str(minuten)
ss = Str(sekunden)
If stunden < 10 : hh = "0"+hh : EndIf
If minuten < 10 : mm = "0"+mm : EndIf
If sekunden < 10 : ss = "0"+ss : EndIf
ProcedureReturn hh+":"+mm+"."+ss
EndProcedure
Debug SecToTime(65)
Debug SecToTime(3600) ;1 Stunde
Debug SecToTime(7230) ;2 Stunden 30 Sekunden
Diese Procedur hab ich für einige meiner Projekte gebraucht.
Wer zu faul ist sich selber eine zu schreiben kann diese benutzen
Zuletzt geändert von
Frogger am 03.09.2006 04:12, insgesamt 2-mal geändert.
[PB4.20]
PMV
Beiträge: 2765 Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg
Beitrag
von PMV » 03.09.2006 00:57
Du weist schon, das PB dafür eine eigene Funktion hat?
Code: Alles auswählen
Debug FormatDate("%hh:%ii.%ss", 65)
Debug FormatDate("%hh:%ii.%ss", 3600) ;1 Stunde
Debug FormatDate("%hh:%ii.%ss", 7230) ;2 Stunden 30 Sekunden
Aber da deine nicht so allgemein ist, vielleicht ist diese ein paar
Millisekunden schneller
... aber is jetzt zu spät als das ich noch nen
Geschwindigkeitstest machen würde ^_^
Mir fällt grad ein, vielleicht gibs die in der 3.3 noch nicht
MFG PMV
alte Projekte:
TSE ,
CWL , Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Frogger
Beiträge: 425 Registriert: 14.03.2006 19:27
Kontaktdaten:
Beitrag
von Frogger » 03.09.2006 03:11
Tja und das ist der kleine aber feine Unterschied
Code: Alles auswählen
Debug SecToTime(1414717430)
Debug FormatDate("%hh:%ii.%ss", 1414717230)
Hier zeigt mir meine Prozedur das richtige Ergebnis an (392:58.37)
und FormatDate kommt da einfach nicht mit.
Was davon schneller ist muss ich noch prüfen.
Das Ergebniss kannst du mit dem Taschenrechner nachprüfen wenn du willst.
[PB4.20]
edel
Beiträge: 3667 Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:
Beitrag
von edel » 03.09.2006 03:25
Formatdate ist sehr wohl richtig , die Maske ist nur unvollstaendig.
Frogger
Beiträge: 425 Registriert: 14.03.2006 19:27
Kontaktdaten:
Beitrag
von Frogger » 03.09.2006 03:47
Du meinst wenn ich %hhh eingebe dann wird das ergebniss richtig?
So funktioniert das auch nicht. (Tage und Monate will ich nicht anzeigen lassen. Nur h, m und s)
Hier schonmal der Speedtest.
Hab die Prozedur etwas Verbessert und handlicher gemacht.
Code: Alles auswählen
Procedure.s SecToTime(sec.l) ;Rückgabewert ist ein string in dieser Form hh:mm.ss
Protected stunden.l = 0, minuten.l = 0, sekunden.l = 0
Protected hh.s, mm.s, ss.s, timestring.s
minuten = sec/60
sekunden = sec-(minuten*60)
stunden = minuten/60
minuten = minuten-(stunden*60)
If stunden < 10
hh.s = "0"+Str(stunden)
Else
hh.s = Str(stunden)
EndIf
If minuten < 10
mm.s = "0"+Str(minuten)
Else
mm.s = Str(minuten)
EndIf
If sekunden < 10
ss.s = "0"+Str(sekunden)
Else
ss.s = Str(sekunden)
EndIf
timestring.s = hh+":"+mm+"."+ss
ProcedureReturn timestring.s
EndProcedure
Procedure.s SecToTime2(sec.l) ;Rückgabewert ist ein string in dieser Form hh:mm.ss
Protected stunden.l, minuten.l, sekunden.l
Protected hh.s, mm.s, ss.s
minuten = sec/60
sekunden = sec-(minuten*60)
stunden = minuten/60
minuten = minuten-(stunden*60)
hh = Str(stunden)
mm = Str(minuten)
ss = Str(sekunden)
If stunden < 10 : hh = "0"+hh : EndIf
If minuten < 10 : mm = "0"+mm : EndIf
If sekunden < 10 : ss = "0"+ss : EndIf
ProcedureReturn hh+":"+mm+"."+ss
EndProcedure
#XYZ = 500000
start.l = GetTickCount_()
For i=1 To #XYZ
SecToTime(1234)
Next
stop1.l = GetTickCount_()-start
start.l = GetTickCount_()
For i=1 To #XYZ
SecToTime2(1234)
Next
stop2.l = GetTickCount_()-start
start.l = GetTickCount_()
For i=1 To #XYZ
FormatDate("%hh:%ii.%ss", 1234)
Next
stop3.l = GetTickCount_()-start
MessageRequester("Speedtest SecToTime...SecToTime2...FormatDate", "Durchläufe: "+Str(#XYZ)+Chr(13)+Chr(10)+"Speed SecToTime: "+Str(stop1)+Chr(13)+Chr(10)+"Speed SecToTime2: "+Str(stop2)+Chr(13)+Chr(10)+"Speed FormatDate: "+Str(stop3))
Bei mir kommt das hier raus:
SecToTime = 1390
SecToTime2 = 1156
FormatDate = 994
Sooo viel schneller ist FormatDate nicht.
[PB4.20]
PMV
Beiträge: 2765 Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg
Beitrag
von PMV » 03.09.2006 04:52
hm, ja ... in dem fall ist FormatDate() schlecht.
Ich hab die Prozedur noch mal nen bischen verändert, so wies scheint ist diese auch was schneller als die anderen. An FormateDate() komms aber natürlich nicht ran.
Code: Alles auswählen
Procedure.s SecToTime(sec.l) ;Rückgabewert ist ein string in dieser Form hh:mm.ss
Protected stunden.l = 0, minuten.l = 0, sekunden.l = 0
Protected hh.s, mm.s, ss.s, timestring.s
minuten = sec/60
sekunden = sec-(minuten*60)
stunden = minuten/60
minuten = minuten-(stunden*60)
If stunden < 10
hh.s = "0"+Str(stunden)
Else
hh.s = Str(stunden)
EndIf
If minuten < 10
mm.s = "0"+Str(minuten)
Else
mm.s = Str(minuten)
EndIf
If sekunden < 10
ss.s = "0"+Str(sekunden)
Else
ss.s = Str(sekunden)
EndIf
timestring.s = hh+":"+mm+"."+ss
ProcedureReturn timestring.s
EndProcedure
Procedure.s SecToTime2(sec.l) ;Rückgabewert ist ein string in dieser Form hh:mm.ss
Protected stunden.l, minuten.l, sekunden.l
Protected hh.s, mm.s, ss.s
minuten = sec/60
sekunden = sec-(minuten*60)
stunden = minuten/60
minuten = minuten-(stunden*60)
hh = Str(stunden)
mm = Str(minuten)
ss = Str(sekunden)
If stunden < 10 : hh = "0"+hh : EndIf
If minuten < 10 : mm = "0"+mm : EndIf
If sekunden < 10 : ss = "0"+ss : EndIf
ProcedureReturn hh+":"+mm+"."+ss
EndProcedure
Procedure.s SecToTime3(sec.l) ;Rückgabewert ist ein string in dieser Form hh:mm.ss
Protected h.l, m.l, s.l, r.s
s = sec % 60
m = sec % 3600
m / 60
h = sec / 3600
r = Str(s)
If s < 10 : r = "0" + r : EndIf
r = Str(m) + "." + r
If m < 10 : r = "0" + r : EndIf
r = Str(h) + ":" + r
If h < 10 : r = "0" + r : EndIf
ProcedureReturn r
EndProcedure
#XYZ = 500000
start.l = GetTickCount_()
For i=1 To #XYZ
SecToTime(1234)
Next
stop1.l = GetTickCount_()-start
start.l = GetTickCount_()
For i=1 To #XYZ
SecToTime2(1234)
Next
stop2.l = GetTickCount_()-start
start.l = GetTickCount_()
For i=1 To #XYZ
SecToTime3(1234)
Next
stop3.l = GetTickCount_()-start
start.l = GetTickCount_()
For i=1 To #XYZ
FormatDate("%hh:%ii.%ss", 1234)
Next
stop4.l = GetTickCount_()-start
MessageRequester("Speedtest SecToTime...SecToTime2...SecToTime3...FormatDate", "Durchläufe: "+Str(#XYZ)+Chr(13)+Chr(10)+"Speed SecToTime: "+Str(stop1)+Chr(13)+Chr(10)+"Speed SecToTime2: "+Str(stop2)+Chr(13)+Chr(10)+"Speed SecToTime3: "+Str(stop3)+Chr(13)+Chr(10)+"Speed FormatDate: "+Str(stop4))
Ergebnis:
1.: 9170
2.: 8268
3.: 7887
FormateDate(): 5272
MFG PMV
alte Projekte:
TSE ,
CWL , Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Frogger
Beiträge: 425 Registriert: 14.03.2006 19:27
Kontaktdaten:
Beitrag
von Frogger » 03.09.2006 13:31
Bei mir ist die sogar 30% schneller als Formatdate.
500000 Durchläufe
SecToTime = 859
SecToTime2 = 719
SecToTime3 = 453
Formatdate = 656
5000000 Durchläufe
SecToTime = 8547
SecToTime2 = 7110
SecToTime3 = 4578
Formatdate = 6562
Aber andererseits wer fragt schon 500000 mal in der Sekunde die zeit ab
[PB4.20]
KingKong
Beiträge: 10 Registriert: 18.09.2004 17:32
Beitrag
von KingKong » 04.09.2006 19:28
Frogger hat geschrieben: Tja und das ist der kleine aber feine Unterschied
Code: Alles auswählen
Debug SecToTime(1414717430)
Debug FormatDate("%hh:%ii.%ss", 1414717230)
Hier zeigt mir meine Prozedur das richtige Ergebnis an (392:58.37)
und FormatDate kommt da einfach nicht mit.
Was davon schneller ist muss ich noch prüfen.
Das Ergebniss kannst du mit dem Taschenrechner nachprüfen wenn du willst.
Wenn man 2 unterschiedliche Parameter benutzt, kann ja auch nie das gleiche Ergebnis kommen !?!?
FormatDate("%hh:%ii.%ss", 1414717230) mit diesen Parametern macht folgendes:
Der Überlauf (alles was größer x mal 24h Stunden ist) wird abgeschnitten.
Der Rest 01:00.30 wird nun angezeigt.
Will man größere Stundenzahl angezeigt bekommen, muß man tatsächlich eine eigene Routine schreiben.
Das Ergebnis "392:58.37" kann aber auch nicht stimmen.
Frogger
Beiträge: 425 Registriert: 14.03.2006 19:27
Kontaktdaten:
Beitrag
von Frogger » 05.09.2006 21:46
Das Ergebnis "392:58.37" kann aber auch nicht stimmen.
Ja das stimmt. Ich hab das nur falsch eingetippt.
Aber die Prozedur liefert das richtige Ergebniss.
[PB4.20]