[GELÖST] Programm hängt sich auf

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

Boris1993

Betreff: [GELÖST] Programm hängt sich auf

BeitragDo, Mai 24, 2012 18:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo
Ich bin bei meinem Projekt auf einen Fehler gestoßen, wo ich einfach nicht hinterblicke.

Mein Programm erstellt nach einer zeit an einem Punkt der sich definitiv innerhalb des Images befindet einen neuen Pixel. 2 mal klappt dies auch doch beim nächsten mal kommt immer die Fehlermeldung "Pixmap coordinates out of bound". Diese Funktion benutze ich um den Pixel zu zeichnen:

Code: [AUSKLAPPEN]
Function drawpixel(img:TImage, x:Byte, y:Byte, r:Byte, g:Byte, b:Byte, a:Byte = 255)
   pixmap = LockImage(img)
   WritePixel pixmap, x, y, a*$1000000 + r*$10000 + g*$100 + b
   pixmap = Null
   UnlockImage(img)
   GCCollect()
End Function


und diese methode verursacht anscheinend den bug:

Code: [AUSKLAPPEN]
   Method roots()
      If time.timer(3, 100) = 1
         For Local seed:TFlora = EachIn seedL
            If Not seed.cells = 0
               For Local cell:TFlora = EachIn seed.cells
                  Local wmax:Byte
                  Local ex:Byte = False
                  
                  For Local nx:Int =-1 To 1
                     For Local ny:Int = -1 To 1
                        If nx = 0 And ny = 0
                           Exit
                        End If
                        
                        If map.wlvl[seed.x+nx, seed.y+ny] > wmax
                           wmax = map.wlvl[seed.x+nx, seed.y+ny]
                        End If   
                     Next
                  Next
                  
                  For Local nx:Int =-1 To 1
                     For Local ny:Int = -1 To 1
                        If nx = 0 And ny = 0
                           Exit
                        End If
                        
                        If map.wlvl[seed.x+nx, seed.y+ny] = wmax
                           Local ncell:TFlora = New TFlora
                           ncell.x = cell.x+nx
                           ncell.y = cell.y+ny
                           cell.typ = 1
                           ListAddLast seed.cells, ncell
                           drawpixel(flora.plants, ncell.x, ncell.y, 200, 180, 170)
                           ex = True
                        End If
                        If ex = True  Exit
                     Next
                     If ex = True  Exit
                  Next
               Next
            End If
         Next
      End If
   End Method


Ich weiß nicht ob dieser Code ausreicht um den Fehler auszumachen da das Programm mitlerweile recht komplex geworden ist. Schonmal Vielen dank wenn mir jemand weiterhelfen kann.

Gruß Boris
  • Zuletzt bearbeitet von Boris1993 am So, Mai 27, 2012 9:09, insgesamt 2-mal bearbeitet

Holzchopf

Meisterpacker

BeitragDo, Mai 24, 2012 18:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Welche Werte haben x und y innerhalb drawpixel() wenn der Fehler auftritt und wie gross ist das Bild?
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
 

Boris1993

BeitragDo, Mai 24, 2012 19:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Also die Pixel befinden sich noch innerhalb des Images wenn der Fehler auftritt. An den Koordinaten scheint es nicht zu liegen. Es ist immer bei dem Dritten Pixel den das Programm aufruft und danach zeigt er noch einmal den Wert an aber bleibt irgendwie in der Schleife stecken, wo die Pixel erstellt werden glaube ich. Ich hab mit drawtext mir die Pixelkoordinaten anzeigen lassen und irgendwann wurden wurden die nurnoch übernander geschrieben also heißt das das Programm ist nicht mehr in der Hauptschleife zu cls gelangt und hat dann wahrscheinlich immer weiter pixel erstellt bis es doch ausserhalb des Bildes war. hmmmmmmmmmm Confused

Holzchopf

Meisterpacker

BeitragDo, Mai 24, 2012 19:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Lass dir die Koordinaten doch mal mit Print ausgeben, dann erscheinen sie in der Output-Konsole und du behältst den Überblick. Oder du baust DebugStop an geeigneter Stelle in deinen Code rein und führst das Programm im Debug-Mode aus, dann kannst du dir die Werte von Variablen anschauen. Unter Umständen klickst du dich dann aber auch wie dämlich durch den Programmablauf, bis der Fehler mal auftritt, aber wenn der Fehler immer beim 3. Pixel erfolgt, sollte das noch human ablaufen.

mfG
Holzchopf
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
 

Boris1993

BeitragDo, Mai 24, 2012 19:14
Antworten mit Zitat
Benutzer-Profile anzeigen
ok danke ich wusste bisher gar nicht das es solche debug möglichkeiten gibt bin noch ein ziemlicher anfänger mit blitzmax gibts fürs debuggen vllt ein kleines tutorial? ach schon gut ich hab grad in der ide hilfe den debugging eintrag gefunden Very Happy
 

Lion

BeitragDo, Mai 24, 2012 19:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja, so schwer ist das nicht, wenn man sich da erstmal dran gewöhnt.
Wie Holzchopf schon sagte, immer eine Zeile bevor der Fehler kommt die notwendigen Variablen printen lassen, das sind dann die, die in der Funktion benötigt werden, in welcher der Fehler kommt.

Ich hab mir deinen Code nicht wirklich angeschaut, aber ich vermute mal, dass der Fehler bei den Koordinaten kommt, bei welchen das Bild seine Maximalgröße hat. Wenn du eine Pixmap der Größe (20|20) erstellst, musst du von 0-19 zeichnen. Wenn du nun bei 20 zeichnen wollen würdest, käme so ein out of bound-Fehler. Ich vermute mal, dass das bei dir der Fall ist.
Intel Core 2 Quad 4x2.66 ghz - 4gb ddr2 - nvidia GeForce GTX660 2gb
Intel Atom 1x1.83 ghz - 2gb ddr2 - intel GMA 3150 256mb
AMD A10-5750M 4x2.5 ghz - 8 gb ddr4 - AMD R9 M290x

Holzchopf

Meisterpacker

BeitragDo, Mai 24, 2012 19:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Midimaster hat eine Reihe von Anfänger-Tutorials geschrieben, darunter ein Fehler-suchen-Tutorial. Ist zwar für BB geschrieben, aber die Grundsätze kannst du auch in BMax anwenden.
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
 

Boris1993

BeitragDo, Mai 24, 2012 19:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja das ist schon bei mir der Fall, aber der eigentliche Fehler geschieht früher, da sich der Code irgendwie in der Schleife aufhängt und nichtmehr zurück zur Hauptschleife kommt daher erstellt sie blitzschnell so viele punkte bis es ausserhalb der pixmap ist. Ganz komische sache Sad
Edit:
Ich glaub ich hab den Fehler jetzt verstanden. Die funktion geht alle einträge der Liste cells durch und erstellt innerhalb noch einen neuen cell eintrag daher kommen immer neue cells dazu ich muss eigentlich nur ein exit machen. Rolling Eyes das hätte mir echt mal früher auffallen können Very Happy
Danke nochmal für die Hilfe Smile

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group