[GarbageCollector] beendet mein Programm unerwartet

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

Skulk

Betreff: [GarbageCollector] beendet mein Programm unerwartet

BeitragDo, Jul 27, 2006 12:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich arbeite gerade an einer simplen tile-engine (wirklich SEHR simpel) und bin auf ein mir unerklärliches Phänomen gestolpert.

Wenn dass Array, dass die Tiles enthält eine bestimmte Dimensionierung erhält, beendet sich mein Programm nach ein paar sekunden mit der Meldung: GC setMemBit: membit

Es handelt sich hier nicht um eine Gigantische Dimensionierung. Nein.
nur um [20,35]

wenn ich das array allerdings auf [20,20] setze funktioniert es einwandfrei.
welchen grund kann es haben dass der Garbagecollector zuschlägt?

Ich benutze keine Types, keine Lists, ich lösche nichts aus dem speicher, ich verändere nichts im speicher.

ich erstelle nur ein array anhand dessen ich die tiles zeichne und prüfe wo sich meine maus befindet

Übrigens, scrollen könnt ihr mit den pfeiltasten. wenn ich scrolle schnappt der GC schneller zu.

ich verstehs net...

bitte um hilfe, danke! Smile

Code: [AUSKLAPPEN]
SuperStrict
Graphics 800, 600

Const  FieldWidth:Int = 20
'Const FieldHeight:Int = 20      'Dieser Wert funktioniert
Const FieldHeight:Int = 35      ' Hier Schlägt der GarbageCollector zu und beendet die Anwendung mit der Meldung: GC setMemBit: membit already set!

Const TileHeight:Int = 32
Const  TileWidth:Int = 32

Global OffsetX:Int = 0
Global OffsetY:Int = 0
 
Global myField:Int[FieldWidth,FieldHeight]

Fuellen()

While Not KeyHit(KEY_ESCAPE)
   Cls
   Movement()
   Zeichnen()
   Flip
Wend
End

Function Fuellen()
   Local iX:Int = 0
   Local iY:Int = 0
   
   For iX = 0 To FieldWidth
      For iY = 0 To FieldHeight
         'myField[iX,iY] = 1
         myField[iX,iY] = Rand(0,10)
      Next
   Next
End Function

Function Movement()
   If KeyDown(KEY_LEFT) Then Scroll(-3,0)
   If KeyDown(KEY_RIGHT) Then Scroll(3,0)
   
   If KeyDown(KEY_UP) Then Scroll(0,-3)
   If KeyDown(KEY_DOWN) Then Scroll(0,3)
End Function

Function Scroll(X:Int, Y:Int)
   OffsetX:+X
   OffsetY:+Y
End Function


Function Zeichnen()
   Local iX:Int = 0
   Local iY:Int = 0
   
   For iX = 0 To FieldWidth
      For iY = 0 To FieldHeight
         If myField[iX,iY] > 1 Then
            DrawTile(iX, iY, IsMouseOver(iX,iY))
         End If
      Next
   Next
End Function

Function DrawTile(X:Int, Y:Int, MouseOver:Byte)
   
   'rahmen
   If MouseOver = True Then
      SetColor 255,128,128
   Else
      SetColor 128,128,255
   End If
   
   DrawRect X * TileWidth - OffsetX, Y * TileHeight - OffsetY, TileWidth, TileHeight
   
   ' vordergrund
   If MouseOver = True Then
      SetColor 128,64,64
   Else
      SetColor 64,64,64
   End If
   
   DrawRect X * TileWidth + 1 - OffsetX, Y * TileHeight + 1 - OffsetY, TileWidth - 2, TileHeight - 2
   
   'reset
   SetColor 255,255,255
End Function

Function IsMouseOver:Byte(gridX:Int, gridY:Int)
   If gridX = ConvertXtoGrid(MouseX()) And gridY = ConvertYtoGrid(MouseY()) Then
      Return True
   Else
      Return False
   End If
End Function

Function ConvertXtoGrid:Int(X:Int)
   Return Floor((X + OffsetX) / TileWidth)
End Function

Function ConvertYtoGrid:Int(Y:Int)
   Return Floor((Y + OffsetY) / TileHeight)
End Function
War doesn't determine who's right,
war determines who's left...
 

Dreamora

BeitragDo, Jul 27, 2006 13:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Komisch
Bei mir kommt das nicht


Dafür kommt ein anderer Fehler und zwar loops du beim Array von 0 - Fieldwidth/ FieldHeight was falsch ist. Die gehen nur bis Fieldwidth-1 / FieldHeight-1
Das liegt daran, dass sich BM wie richtige Programmiersprachen verhält. Sprich wenn man einen Array mit 20 Elementen erzeugt sind 20 Elemente drin, nicht wie bei den alten Blitz 21.

Es gibt die Elemente 0 bis Size-1
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

Skulk

BeitragDo, Jul 27, 2006 14:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh hubs,
ja das war nur ein denkfehler. klar, so sollte es ja sein...

nachdem ich das korrigiert habe scheint der fehler auch nicht mehr aufzutreten....hm ich verfolg das noch etwas weiter, aber so wie es aussieht, war die falsche idexierung daran schuld...
War doesn't determine who's right,
war determines who's left...

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group