Speicherüberflutung!
Übersicht

![]() |
TravisBetreff: Speicherüberflutung! |
![]() Antworten mit Zitat ![]() |
---|---|---|
Im Codearchiv gibt's ja neuerdings so ein 2D-Sternenfeld und ich wollte mal meine eigene Version dazustellen. Dafür habe ich sie auf WritePixelfast umgestellt, ein wenig optimiert und einen FPS-Counter eingefügt. Wenn ich das Programm jetzt aber starte, wird sofort der komplette Speicher zugemüllt. Das führt dazu, dass innerhalb von sekunden die Auslagerungsdatei auf 2GB anwächst und das System völlig überlastet wird.
Man kann das Programm dann nur noch über den Taskmanager beenden! Kann mir das vielleicht einer erklären? Wenn ich die Sterne jetzt versehentlich in der Hauptschleife erstellt hätte, könnte ich's ja verstehen, aber so... Code: [AUSKLAPPEN] Global FPSSEC = MilliSecs(), FPS, FRAMES Graphics 800,600,16,2 SetBuffer BackBuffer() ; --- Sternenhintergrund erstellen --- Type star Field x#, y#, sx#, sy#, layer, col End Type For i = 1 To 500 s.star = New star s\x = Rnd (0,800) s\y = Rnd (0,600) s\layer = Rnd(1,4) s\sx# = Cos(180) * s\layer s\sy# = Sin(180) * s\layer i = s\layer*50 s\col = a*$1000000 + i*$10000 + i*$100 + i Next ; --- Sternenhintergrund erstellen --- ; --- Hauptprogramm --- Repeat Cls UpdateStars() Text 0,0, "FPS: " + fps Flip Until KeyHit(1) End ; --- Hauptprogramm --- ; --- Sterne bewegen und anzeigen --- Function UpdateStars() LockBuffer BackBuffer() For s.star = Each star s\x# = s\x# + s\sx# s\y# = s\y# + s\sy# If s\x < 0 Then s\x = 800 If s\x > 800 Then s\x = 0 If s\y < 0 Then s\y = 600 If s\y > 600 Then s\y = 0 WritePixelFast s\x, s\y, s\col Next UnlockBuffer BackBuffer() End Function ; --- Sterne bewegen und anzeigen --- ; --- FPS ermitteln --- Function FPS() FRAMES = FRAMES + 1 If MilliSecs() - FPSSEC => 1000 Then FPS = FRAMES FRAMES = 0 FPSSEC = MilliSecs() EndIf Return FPS End Function ; --- FPS ermitteln --- |
||
www.funforge.org
Ich hasse WASD-Steuerung. Man kann alles sagen, man muss es nur vernünftig begründen können. |
![]() |
Jan_Ehemaliger Admin |
![]() Antworten mit Zitat ![]() |
---|---|---|
i = s\layer*50
i kommt nie auf 500! <-- unendlich for next schleife! |
||
between angels and insects |
![]() |
Garfield |
![]() Antworten mit Zitat ![]() |
---|---|---|
Die ForNext Variable i wird in der Schleife verändert, das ist extrem gefährlich, vermutlich wolltest du das garnicht andere Variable und es müsste gehen ![]() bei 200 Sternen braucht das Programm 8,5 MB, bei 250 Sternen gehts ins Unendliche... da liegt der Hase im Pfeffer |
||
BlitzPlus|BMax|BMax-GUI -- Sony VAIO Win7 * MacBookPro Sierra |
![]() |
Travis |
![]() Antworten mit Zitat ![]() |
---|---|---|
Arrgh, stimmt. i nehme ich ja immer für Schleifen und das i für die Farbe habe ich als Abkürzung für Intensität gedacht. Danke, das habe ich immer total übersehen. Ein Buchstabe hinzugefügt und schon läufts... | ||
www.funforge.org
Ich hasse WASD-Steuerung. Man kann alles sagen, man muss es nur vernünftig begründen können. |
![]() |
Gossi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mit dem richtigen Einsatz von Local wäre dir das nicht passiert ![]() |
||
Alle Wasser laufen ins Meer, doch wird das Meer nicht voller; an den Ort, dahin sie fließen, fließen sie immer wieder. (...) Was geschehen ist, eben das wird hernach sein. Was man getan hat, eben das tut man hernach wieder, und es geschieht nichts neues unter der Sonne. Geschieht etwas, von dem man sagen könnte: "Sieh, das ist neu"? Es ist längst vorher auch geschehen in den Zeiten, die vor uns gewesen sind. |
![]() |
Garfield |
![]() Antworten mit Zitat ![]() |
---|---|---|
Die ForNext Variable i wird in der Schleife verändert, das ist extrem gefährlich, vermutlich wolltest du das garnicht andere Variable und es müsste gehen ![]() bei 200 Sternen braucht das Programm 8,5 MB, bei 250 Sternen gehts ins Unendliche... da liegt der Hase im Pfeffer |
||
BlitzPlus|BMax|BMax-GUI -- Sony VAIO Win7 * MacBookPro Sierra |
![]() |
Travis |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das ist aber echt der Hammer gewesen. Programm gestartet - Nix passiert - beenden geht nicht - Taskmanager auf Speicher: 30 MB - 140 - 500 MB - Auslagerungsdatei 0,5 GB - 1GB - 1,5GB - Resetknopf! | ||
www.funforge.org
Ich hasse WASD-Steuerung. Man kann alles sagen, man muss es nur vernünftig begründen können. |
![]() |
Hubsi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Gossi hat Folgendes geschrieben: Mit dem richtigen Einsatz von Local wäre dir das nicht passiert ![]() ![]() |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Und an Pos 800x600 steht der Stern evtl. im Speicher irgendwo ,
hatte ich aber schon im CodeArchiv erwähnt ... |
||
![]() |
Gossi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hubsi hat Folgendes geschrieben: Gossi hat Folgendes geschrieben:
Mit dem richtigen Einsatz von Local wäre dir das nicht passiert ![]() ![]() Code: [AUSKLAPPEN] ;Local i For i = 1 To 500 s.star = New star s\x = Rnd (0,800) s\y = Rnd (0,600) s\layer = Rnd(1,4) s\sx# = Cos(180) * s\layer s\sy# = Sin(180) * s\layer i = s\layer*50 ;<<<<< Local i = s\layer*50 ! s\col = a*$1000000 + i*$10000 + i*$100 + i Next So wäre ihm der Fehler nicht passiert. |
||
Alle Wasser laufen ins Meer, doch wird das Meer nicht voller; an den Ort, dahin sie fließen, fließen sie immer wieder. (...) Was geschehen ist, eben das wird hernach sein. Was man getan hat, eben das tut man hernach wieder, und es geschieht nichts neues unter der Sonne. Geschieht etwas, von dem man sagen könnte: "Sieh, das ist neu"? Es ist längst vorher auch geschehen in den Zeiten, die vor uns gewesen sind. |
![]() |
Travis |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das funzt? Ich mag diesen ganzen Global/Local-Kram nicht, das verwirrt mich nur. Da nehme ich in diesem speziellen Fall dann doch lieber einen anderen Variablennamen. ![]() Aber trotzdem interessant zu wissen, das es so geht! |
||
www.funforge.org
Ich hasse WASD-Steuerung. Man kann alles sagen, man muss es nur vernünftig begründen können. |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Local würd da auch net helfen
Local is dazu da, wenn du eine globale Variable A hast, in einer Funktion jedoch ebenfalls eine Variable A, dann kannst du diese per local deklarieren ( also Local A ), dann wird innerhalb beim Aufruf von A die lokale Variable genommen, nicht die globale. Solche fehler wie dieser in diesem Source können garnicht umgangen werden, deshalb solltest du 1stellige Variablen wirklich nur für schleifendurchläufe nehmen und alles andere mit aussagekräftigen Variablen versehen. Das senkt die Gefahr für derartige Fehler drastisch |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
Gossi |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Travis: nein, der Code geht nicht! Darum geht es ja! Wann immer du eine neue Variable benutzt, solltest du diese mit Local deklarieren. Benutzt du dann 2 Variablen (fälschlicherweise für 2 verschiedene Zwecke) würde dich BlitzBasic warnen, da du in einer Funktion 2x Local i benutzt hast. So hättest du den Fehler sofort erkannt. | ||
Alle Wasser laufen ins Meer, doch wird das Meer nicht voller; an den Ort, dahin sie fließen, fließen sie immer wieder. (...) Was geschehen ist, eben das wird hernach sein. Was man getan hat, eben das tut man hernach wieder, und es geschieht nichts neues unter der Sonne. Geschieht etwas, von dem man sagen könnte: "Sieh, das ist neu"? Es ist längst vorher auch geschehen in den Zeiten, die vor uns gewesen sind. |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group