Seite 1 von 2

[PB 4.20] Mit Debugger=Error -- Ohne Debugger fehlerfrei O_o

Verfasst: 08.08.2008 14:41
von wolle212
Moin,

für dieses Beispiel müsst ihr noch ein Bild laden. Die Prozeduren sind für ein anderes Projekt gedacht, und sollen später mal dafür sorgen, dass ein Bild gezoomt dargestellt werden kann, ohne dies durch ein ständiges "On-the-Fly"-Größenverändern zu machen; sondern es soll ein Bild nur einmal in der Größe verändert, dann auf ein screengroßes Image gerendert, und dieses Image soll dann immer angezeigt werden. (Dieses kann man dann bspw. auch scrollen; weil Scrollen mit On-the-Fly-Resize ist zäh :) )
Erst wenn eine Änderung im Anzeig-Modus kommt, wird das Anzeigebild neu gerendert ... ist natürlich noch nicht fertig und erst ein Flag ist möglich ...

... womit wir beim Thema wären: Eigentlich bin ich der Meinung, dass der Code richtig ist, jedoch spuckt mir der Debugger ein ominöses
[ERROR] The specified output is NULL (0 value)
bei StartDrawin(ScreenOutput()) aus. Jedoch erst beim Zweiten Schleifendurchlauf. Was mich aber am meisten irritiert: Ohne Debugger läuft das Programm ohne Abbruch. Nur ohne Debugger zu coden ist ... suboptimal :(

BTW: Vorher hatte ich die 4.20 Beta2 -- da brach er mit dem internen Debugger bei gleicher Fehlermeldung ab; der externe hatte da keine Probleme. Deswegen habe ich PB geupdatet -- nun funzt es mit keinem Debugger mehr ...

Könnt ihr das Verhalten bei euch reproduzieren? Mach ich was mit dem Wechsel von ImageOutput() zu ScreenOutput() falsch? Liegt es am PB-Debugger? Fragen über Fragen ...

hat jemand eine Antwort?

TIA!

Code: Alles auswählen

;Sry für das Denglisch :)
Global height
Global width

;Auflösung des Screens
height =960
width  =1280

InitSprite()
InitKeyboard()
UseJPEGImageDecoder()
OpenScreen(width,height,32,"DrawImage")

Global bild
bild=LoadImage(#PB_Any,"01.jpg")



Enumeration 
	#FitWidth
	#FitHeight
	#Centered
	
	#PrePaint
EndEnumeration

Procedure PreDrawImage(ImageID,flag=#FitWidth)
	Debug "PreDrawImage() called"
	CreateImage(#PrePaint,width,height)
	
	Select flag
		Case #FitWidth
			Debug "Mode FitWidth"
			Debug ImageWidth(bild)
			Debug ImageHeight(bild)
			b.d	= ImageWidth(bild)
			h.d	= ImageHeight(bild)
			ratio.d = b/h		
			Debug "This should Not be null"
			Debug "ratio="
			Debug ratio
			If ratio=0
				Debug "Damn"
			EndIf	
			p_height.d 	=width/ratio
			p_height=Round(p_height,0)
			p_width.d	=width
			x			=0
			y			=0			
	EndSelect
	
	StartDrawing(ImageOutput(#PrePaint))
		Debug "Pwidth and pheiht"
		Debug p_width
		Debug p_height
		If IsImage(bild)
			DrawImage(ImageID(Bild),x,y,p_width,p_height)
		Else
			Debug "damn"
			End
		EndIf		
	StopDrawing()
	
	StartDrawing(ScreenOutput())
		DrawImage(ImageID(#PrePaint),0,0)
	StopDrawing()
	FlipBuffers()	
	
	Debug "PreDrawImage() exit"
EndProcedure


Procedure DrawImageOnScreen(ImageID,Mode)
	Debug "Prozdur DrawImage called"
	
	If IsImage(#PrePaint)=#False
		Debug "Prepaint is no Image"
		PreDrawImage(ImageID,Mode)
		Debug "Call DrawImageOnScreen"
		DrawImageOnScreen(ImageID(#PrePaint),Mode)
	Else
		Debug "Prepaint is a Image"
		Debug "Try to draw"
		ClearScreen(RGB(255,0,0))	
		StartDrawing(ScreenOutput())
			DrawImage(ImageID(#PrePaint),0,0)
		StopDrawing()
		FlipBuffers()
	EndIf	
EndProcedure

i=0
Repeat
	PreDrawImage(bild,#FitWidth)
	ClearScreen(RGB(0,0,0))
	Debug "ScreenOutput"
	ExamineKeyboard()
	Delay(10)
	Debug "Durchlauf #"+Str(i)
	i+1
Until KeyboardPushed(#PB_Key_Escape)
Edit: Kleiner Inhaltsfehler, typpo.

Verfasst: 08.08.2008 14:54
von Fluid Byte
Das liegt an deiner Debug-Orgie, entferne die Aufrufe und es funktioniert.

Verfasst: 08.08.2008 14:56
von ts-soft
Keine Probleme mit irgendeinem Debugger oder ohne. Vielleicht mal
EnableExplicit nutzen! (ohne ist jeder Source wertlos)
Testen ob das Bild geladen wird usw.

Gruß
Thomas

OK

Verfasst: 08.08.2008 14:57
von wolle212
das drollige ist ja, dass diese Debug-Orgie eben aufgrund des Fehlers erst da hineingekommen ist :lol: -- wie gesagt, noch unter der Beta ...

Gleich mal testen ...

Verfasst: 08.08.2008 14:59
von Fluid Byte
Dann würde ich schnellstmöglich auf 4.20 Final umzusteigen und den Code nochmal testen.

Hmmm

Verfasst: 08.08.2008 15:11
von wolle212
Das Updaten habe ich bereits gemacht, da funktionierte es bei mir mit keinem Debugger mehr. Daher mein Post.

Bei mir gibt es aber auch wenn ich alle Debugaufrufe entferne immer noch das gleiche Problem bei eingeschaltetem Debugger ... wo liegt da nur der Fehler ...

Hmm, ich werde das mal auf einem anderem PC testen, nicht das mein System irgendwie kaputt ist, weil hier ja schon die Meldung kam, der Code würde funzen, egal ob der Debugger ein- oder ausgeschaltet ist, mal schauen.

@TS-Soft:
EnableExplicit? Ist das nicht eher dafür gedacht, wenn man plattformübergreifend programmieren will?
Ich sehe grad nicht den Nutzen für mein jetziges Problem ... OK -- grade unter der Hilfe nochmals den Eintrag gelesen -- es ist vielleicht doch nicht so dumm, darauf zu setzen, aber erst mal will ich den Debug-Bug loswerden :)

Verfasst: 08.08.2008 15:16
von Fluid Byte
Versuch mal eine komplette Neuinstallation von PB. Also nix mit Update sondern Ordner plattmachen und 4.20 frisch installieren. und vergiss EnableExplicit, das ist hier irrelevant denn es geht bei mir ohne Debugs. Es wird wahrscheinlich auch sogar mit Debugs auf meinem Rechner zuhause gehen. Der Rechner auf dem ich das hier teste hat nur onboard Intel GraKa und ist halt zum Arbeiten gedacht und nicht zum "rumspielen".

Verfasst: 08.08.2008 15:25
von Kaeru Gaman
das EnableExplicit hat ts erwähnt, weil das eine ganz grundlegende
Verfahrensweise ist, Typos in Variablennamen zu eliminieren.
ohne dem können Variablen on-the-fly definiert werden, was dazu führt,
dass seltsamste fehler auftreten können wenn man irgendwo nen Namen vertippt.

und generell was das Updaten betrifft:
mit dem normaler Installer immer nur in jungfräuliche Verzeichnisse installieren,
denn das ist ein Installer kein Updater.

Ich glaube es ist gelöst

Verfasst: 08.08.2008 15:37
von wolle212
Ich habe PB ganz runter gehauen, neu installiert -- auch den Ordner in %AppData% gelöscht -- immer noch das gleiche Problem. Um auszuschließen, dass es mein Rechner ist, habe ich eben PB auf einen anderen Rechner installiert; dort zeigen sich aber leider die gleichen Symptome. Bei eingeschaltetem Debugger gibt es einen Fehler, ohne Debugger läuft und läuft und läuft es ...

Und was das Vertippen angeht: Eine gute Methode, um die zu vermeiden, ist die Autovervollständigung, die ich exessiv nutze.

Ich bin nach wie vor ratlos, warum dieses Problem auftritt; auch wäre es toll wenn sich jemand meldet, bei dem der Debugger den Fehler ausspuckt! Ich will nicht alleine sein :)

EDIT:
ts-soft hat geschrieben: [...]
Testen ob das Bild geladen wird usw.
[...]
Das dürfte eigentlich nicht das Problem sein, der Fehler tritt ja bei StartDrawing(ScreenOutput()) auf ... da verschluckt er sich ...

EDIT2:
Vielversprechenden Post im englischen Forum gefunden:

EDIT3:
Ich glaube, ich weiß jetzt, was das Problem ist. Ich habe kein IsScreenActive() verwendet. Ich vermute, dass das Debugger-Fenster dafür sorgt, dass mein Screen inaktiv wird, wodurch man eben nicht drauf zeichnen darf.

Mit einer IsScreenActive()-Active-Abfrage bricht das Prog zwar nicht mehr ab, allerdings sehe ich während es läuft nur den Desktop ... AHA ... der Debugger minimiert das Programm und dort läuft es weiter, und da ist eben der Screen NICHT aktiv! Debugger-Fenster schließen und Programm wieder in den Vordergrund holen funzt!

Hier der Code:

Code: Alles auswählen

Global height
Global width

;Auflösung des Screens
height =960
width  =1280

InitSprite()
InitKeyboard()
UseJPEGImageDecoder()
OpenScreen(width,height,32,"DrawImage")

Global bild
bild=LoadImage(#PB_Any,"01.jpg")



Enumeration 
	#FitWidth
	#FitHeight
	#Centered
	
	#PrePaint
EndEnumeration

Procedure PreDrawImage(ImageID,flag=#FitWidth)
	CreateImage(#PrePaint,width,height)
	
	Select flag
		Case #FitWidth
			b.d	= ImageWidth(bild)
			h.d	= ImageHeight(bild)
			ratio.d = b/h		
			p_height.d 	=width/ratio
			p_height=Round(p_height,0)
			p_width.d	=width
			x			=0
			y			=0			
	EndSelect
	
	StartDrawing(ImageOutput(#PrePaint))
		Debug "Pwidth and pheiht"
		Debug p_width
		Debug p_height
		If IsImage(bild)
			DrawImage(ImageID(Bild),x,y,p_width,p_height)
		Else
			End
		EndIf		
	StopDrawing()
	
	If IsScreenActive()
	  ClearScreen(RGB(255,0,0))
	  StartDrawing(ScreenOutput())
		  DrawImage(ImageID(#PrePaint),0,0)
	  StopDrawing()	
	EndIf
	FlipBuffers()
EndProcedure


Procedure DrawImageOnScreen(ImageID,Mode)
	If IsImage(#PrePaint)=#False
		PreDrawImage(ImageID,Mode)
		DrawImageOnScreen(ImageID(#PrePaint),Mode)
	Else
		ClearScreen(RGB(255,0,0))	
		StartDrawing(ScreenOutput())
			DrawImage(ImageID(#PrePaint),0,0)
		StopDrawing()
		FlipBuffers()
	EndIf	
EndProcedure

i=0
Repeat
	PreDrawImage(bild,#FitWidth)
	ClearScreen(RGB(0,0,0))
	ExamineKeyboard()
	Delay(10)
	i+1
Until KeyboardPushed(#PB_Key_Escape)

Verfasst: 08.08.2008 16:06
von ts-soft
EnableExplicit hab ich deshalb erwähnt, weil ich nicht bereit bin fehler in
codes zu suchen, die in keinster weise gegen fehler geschützt sind, tippfehler
suchen, weil der autor zu faul ist seine variablen zu deklarieren halte ich für
unzumutbar.

Da wir nicht im Anfängerforum sind, erwarte ich declarierte Variablen.

Für PB gibts 2 Versionen, einmal das Setup, welches nicht über eine
vorhandende Version installiert werden sollte, sowie ein Update, welches
dazu bestimmt ist.

Aber in Zukunft wirds wohl nur noch eine Version geben, die beides kann,
somit ist das jetzt auch nicht mehr so wichtig.

Bei mir funktioniert der Code auf jedemfall Fehlerfrei, so das der Fehler
eigentlich nur beim Pfad zum Bild oder das Bild selber ist defekt.

Gruß
Thomas