Problem bei Millisecs()

Übersicht BlitzBasic Beginners-Corner

Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.

 

Ali

Betreff: Problem bei Millisecs()

BeitragFr, Okt 14, 2005 11:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo.
Ich bin ein Perfektionist.
Z.B. verwende ich nur dann Gosub, wenn auch der Spieler vom Untermenü auch nicht woanders hin verzweigen kann und die Schleife AUF JEDEN FALL abgeschlossen wird. Sonst zieht's n Rattenschwanz hinter sich her und es kann im Spiel abstürzen.
Folgendes Beispiel:


.a
gosub b

.b
gosub a


Dieses Programm läuft nicht mal ne 1/4 Sekunde. Es stürzt GLEICH ab.
Bei


.a
goto b

.b
goto a


wäre das nicht passiert.
Das nur, um zu zeigen, daß ich Perfektionist bin.
Genau aus dem gleichen Grund möchte ich nicht mit Millisecs() programmieren. Ganz einfach, weil die Zahl immer größer und größer wird und irgendwann in 20 Milliarden Jahren oder so die Zahl so groß ist, daß der Computer die einzelnen Ziffern sich nicht mehr merken kann...
Das würde ja noch gehen, wer lebt schon so lang, aber ich hab irgendwo hier gelesen, daß BB sogar nach 49,7 Tagen abstürzt, da BB eine Zahlenbegrenzung bei ca. 2,1 Mrd. hat. Das heißt, Millisecs() überscheitet diese 2,1 Miliarden nach ca. 50 Tagen. Mein Problem:
Ich programmier grad n Spiel, das aber "perfekt" zu sein hat, meinen Anforderungen wegen. Und es kann nicht sein, daß ich von jemandem verlange, daß er ... Sagen wir mal, er hat n Server, der schon seit 5 Jahren an ist, und er will mein Spiel zocken. Ich kann doch von ihm nicht verlangen, daß er extra wegen mir den Computer neu startet! Ich finde das blöd. Ich habe mir gedacht, daß man Millisecs() SOFORT in eine Zeichenkettenvariable speichert, dann abfragt, wieviele Zeichen in dieser Zeichenkettenvariable drin sind, und die letzten 7 meinetwegen nimmt und in eine Zahlenvariable umwandelt. Diese könnte man dann zum Zufallszahlgenerieren nutzen.

Aber ich weiß nicht, ob das geht. Ich kann mir schwer vorstellen, daß BB Millisecs() AUSLIEST, NICHT abstürzt, diese in einer Zeichenkettenvariable speichert usw. Wenn er das machen würde, wäre das ja kein Problem.
Was meint ihr? Wie kann man dieses Problem umgehen? Leides ist Millisecs() so weit ich weiß, die EINZIGE Möglichkeit, Zufallszahlen zu erzeugen... Deshalb kann man ohne Millisecs() GAR keine Zufallszahlen erzeugen und ist somit dem 49,7-Tage-Absturz hilflos ausgeliefert.
Shocked

Ali

bruZard

BeitragFr, Okt 14, 2005 12:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Du laberst einen geistigen Durchfall dass es mir fast nicht wert war zu antworten...
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32

User posted image

Spikespine

BeitragFr, Okt 14, 2005 12:24
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzBasic: [AUSKLAPPEN]
MilliSecs() And $7fFFffFF
Athlon 64 3700+ | 1024 MB RAM | GeForce 7900 GT | Blitz2D, Blitz3D, BlitzPlus, BlitzMax

ssj-goku

BeitragFr, Okt 14, 2005 12:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Omg was will der Oo

Spikespine

BeitragFr, Okt 14, 2005 12:33
Antworten mit Zitat
Benutzer-Profile anzeigen
was willst du?
Les dir einfach mal diesen Thread durch, und nerv nicht:
Athlon 64 3700+ | 1024 MB RAM | GeForce 7900 GT | Blitz2D, Blitz3D, BlitzPlus, BlitzMax
  • Zuletzt bearbeitet von Spikespine am Fr, Okt 14, 2005 13:58, insgesamt einmal bearbeitet

Xaron

Betreff: Re: Problem bei Millisecs()

BeitragFr, Okt 14, 2005 13:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Ali hat Folgendes geschrieben:
.a
gosub b

.b
gosub a


Dieses Programm läuft nicht mal ne 1/4 Sekunde. Es stürzt GLEICH ab.
Bei


.a
goto b

.b
goto a


wäre das nicht passiert.


Beides ist einfach nur böse... Shocked

Wenn Du wirklich nach letzterem programmierst, bist Du von einem Perfektionisten meilenweit entfernt...

Gruß - Xaron
Cerberus X - Monkey X Reloaded!

bruZard

BeitragFr, Okt 14, 2005 13:05
Antworten mit Zitat
Benutzer-Profile anzeigen
@Xaron: Nicht nur das macht ihn zum Idioten ... auch die Vermutung dass BB nach 49,7 Tagen einfach abstürzt ist heilloser Unsinn...
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32

User posted image

Jan_

Ehemaliger Admin

BeitragFr, Okt 14, 2005 13:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Du bist perfectionist, und ich bin perfect,
Wenn millisecs() 2 mrd überteigt,
gehts bei -2mrd weiter

also, if ms1 <ms then ...
between angels and insects
 

$tankY

BeitragSa, Okt 15, 2005 11:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat aus der deutschen Onlinehilfe:
Bei Windows 95/98-Rechnern ohne Sicherheitsupdate kommt es nach 49,7 Tagen zu einem Timer-Überlauf und automatisch zu einem Absturz. Dies kommt daher, weil ein maximaler Wert von 2^32=4294967296 erreicht wird und der Windows-Timer nicht auf Null springt. Ein Windows-Update lässt das System nicht mehr abstürzen - es wird nur von Zeit zur Zeit neugestartet Wink.

Aber ich glaub net, dass es noch Server gibt, welche Win 95/98 ohne Sicherheitsupdate haben, oder dass der server nicht zum update heruntergefahren wurde...
 

Black

BeitragSa, Okt 15, 2005 11:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Es gibt schon Probleme mit Timern wenn die Programme lange laufen:
Bei 32bit ints sind es die bekannten 49 tage. Bei floats geht die genauigkeit nach einiger Zeit flöten was auch ziemlich katastrophal ist. Gott sei dank ist mit 64bit alles besser (oder man benutzt doubles) Smile
Es macht aber nicht wirklich Sinn, sich wegen solcher Probleme den Kopf zu zerbrechen, wenn man goto und gosub so verwendet wie du es tust Razz
 

Ali

BeitragSo, Okt 16, 2005 12:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo.

Ich habe mir dieses Minitut angeschaut.

Es gibt ein kleines Zeitfenster von
startzeit + DAUER < 0 und Millisecs() > 0
bis
startzeit + DAUER < 0 und Millisecs() < 0

In diesem Zeitfenster wird "Blitz!!!!" nicht alle 150 Millisekunden,
sondern bei JEDEM Repeat-Durchlauf auf den Monitor projeziert.
Das Programm ist also nicht fehlerfrei.

Abgesehen davon:
Millisecs() springt von +2Mrd. auf -2Mrd.
Danach wird auf -2Mrd. immer 1 hinzuaddiert,
und obwohl die Zahl immer kleiner zu werden scheint,
weil -1Mrd. sieht doch kleiner aus wie -2Mrd.,
ist doch -1Mrd. GRÖßER als -2Mrd.
Eigentlich sollte der Timer im negativen Bereich GENAUSO funktionieren.

OldMillisecs = MilliSecs()
Repeat
Cls
SetBuffer BackBuffer()
DAUER = 250
If (Oldmillisecs + Dauer) < Oldmillisecs Then ; haben wir das oben genannte Zeitfenster schon betreten?

If (MilliSecs() + Dauer) > (MilliSecs()) Then ; wenn ja, hat Millisecs() das Vorzeichen gewechselt?
; Programm wird erst bei (Millisecs() + Dauer) ausgeführt. Diese liegen ja inzwischen im negativen Bereich.
; Da Millisecs() (Millisecs() + Dauer) erreichen muß, muß Millisecs() AUCH ein negatives Vorzeichen haben.

If (MilliSecs()) >= (Oldmillisecs + DAUER) Then
OldMillisecs = (MilliSecs())
Text Rand(200),Rand(200),"Blitz!!!!"
End If
End If
End If
If Oldmillisecs + DAUER > Oldmillisecs Then
If (MilliSecs()) >= (Oldmillisecs + DAUER) Then
OldMillisecs = (MilliSecs())
Text Rand(200),Rand(200),"Blitz!!!!"
End If
End If
Flip
Until KeyHit(1)
End


Was dieses Programm anbelangt,
sie läßt beim Sprung von + nach - weder ein "BLITZ!!!!" aus, noch zeichnet es welche zuviel.
Beim Sprung von +2Mrd.irgendwas zu -2Mrd.irgendwas wird der Zeitraum von 150 ms genau eingehalten! Very Happy


Im Minitutorial steht:
Der Vorteil an dieser Methode liegt auch darin dass der erste Start automatisch erfolgt, auch wenn die
Startzeitpunkt-Variable noch nicht belegt wurde, da sie dann ja mit einer "0" befüllt ist und somit auf jeden Fall
kleiner ist als die Zeit in Millisecs().

Hier muß man wohl, so wie's aussieht, eine Startzeitpunkt-Variable belegen, da Millisecs() auch negativ sein kann.

@ Xaron Wie würdst DU umgehen, daß

.a
Gosub b

.b
Gosub a

abstürzt, OHNE Goto zu verwenden??
Der Grund, WARUM es abstürzt, ist doch der, weil Gosub sich MERKT, von wo das Unterprogramm gestartet wurde, bis irgendwann der Speicher voll ist und BB einfriert. Mit Goto wäre das NICHT passiert.

@ bruZard Du bist unfreundlich. Das mit den 49,7 Tagen steht in der ONLINEHILFE! Wenn du sagst, daß das, was in der Onlinehilfe steht, falsch ist, macht das dich zum Idioten.
 

Knartz

BeitragSo, Okt 16, 2005 12:35
Antworten mit Zitat
Benutzer-Profile anzeigen
"ich bin perfektionist" - aha
"ich benutz goto" - uh oh

wohl eher - "ich hab keine ahnung wie, aber ich bin gott"

kann mal jemand diesen thread löschen ...

D2006

Administrator

BeitragSo, Okt 16, 2005 12:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Programm wird NICHT nach 49,7 Tagen abstürzen. Sondern Windows. Allerdings Windows 98 in der ungepatchten Version. Das hat niemand mehr. Selbst die SE hatte den Fehler behoben.

Außerdem ist es oberpeinlich wie du dich Perfektionist schimpfst und dann Goto bzw. Gosub verwendet. In der Zeit von objektorientierter Programmierung bist du noch nicht mal bei Funktionen angekommen, willst aber ein Perfektionist sein.

Desweiteren existiert BlitzBasic schon ein paar Jahre und mir ist noch nie aufgefallen, dass irgendjemand ein Problem damit hatte, dass Millisecs einen Überlauf bekommt. Wer spielt schon ein Spiel 49,7 Tage?

Alles in allem sieht das ganze aus wie ein Knockout, wodurch Muhammed Ali besiegt worden ist. Laughing

phpBB hat so schöne [ code ] Tags...

MfG
D2006
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard
Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium
Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2

BtbN

BeitragSo, Okt 16, 2005 14:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Ali hat Folgendes geschrieben:
@ bruZard Du bist unfreundlich. Das mit den 49,7 Tagen steht in der ONLINEHILFE! Wenn du sagst, daß das, was in der Onlinehilfe steht, falsch ist, macht das dich zum Idioten.


Onlinehilfe: AddVertex hat Folgendes geschrieben:
Die optionalen Koordinaten U und V sind für die Verschiebung der Textur gedacht. Dies funktioniert so: Die untere|linke Texturecke hat die Koordinate 0|0. Die obere|rechte Texturecke hat die Koordinate 1|1. Die Koordinate 0.5|0.5 ist dabei folgerichtig mittig auf der Textur.


Stimmt nicht, oben links is 0|0, und unten rechts 1|1 ^^
Da, bin ich ein Idiot?
 

Black

BeitragSo, Okt 16, 2005 15:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Kann sein, zumindest OGL benutzt ein Koordinatensystem wie es oben beschrieben wird.

BlitzChecker

BeitragSo, Okt 16, 2005 16:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Jan_ hat Folgendes geschrieben:
Du bist perfectionist, und ich bin perfect,
Wenn millisecs() 2 mrd überteigt,
gehts bei -2mrd weiter

also, if ms1 <ms then ...


In der Rechtschreibung scheinst du aber nicht so perfekt zu sein, denn "perfekt" schreibt man mit "k" und nicht mit "c"!
www.xairro.com

Triton

BeitragSo, Okt 16, 2005 17:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Jaja, ihr seid alle soo perfekt und die anderen natürlich nicht.

Dieser Thread hat sich bis hierhin jedenfalls in die absolutie Idiotie gesteigert und wird daher von mir geschlossen

Die Frage, wozu du ein Programm fast 50 Tage lang laufen lassen willst
wurde glaube ich noch nicht beantwortet. Ich kenne keine Anwendung,
bei der das notwendig wäre. Und was deine sonstigen Probleme hinsichtlich perfektionismus angeht...ach, ich hol mirn Bier.
Coding: silizium-net.de | Portfolio: Triton.ch.vu

Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group