For-Schleife wird "übersprungen"

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

Hubsi

Betreff: For-Schleife wird "übersprungen"

BeitragFr, Okt 28, 2016 11:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Rudi Ratlos ist mal wieder zu Gast Very Happy

Folgender Code:
BlitzMax: [AUSKLAPPEN]
Function CheckHole:Byte(x_start:Int, y_start:Int, way:Int)
Local x:Short, y:Short

x_start = ((x_start + 16) / 32) + way
y_start = (y_start + 48) / 32

If way = -1 Then
DebugLog x_start
DebugLog x_start + (4 * way)
DebugStop
For x = x_start To x_start + (4 * way) Step - 1
DebugLog map_tile[x, y_start, 0]
If map_tile[x, y_start, 0] > 0 Then Return True
Next
Else
For x = x_start To x_start + (4 * way)
If map_tile[x, y_start, 0] > 0 Then Return True
Next
EndIf
DebugLog way
DebugStop
End Function


Ich bekomme im Debuglog diese Ausgaben (way ist im Testfall immer -1):

x_start -> 64
x_start + (4 * way) -> 60

Soweit sind die Werte noch richtig. Der Erwartungswert wenn ich das Programm weiterlaufen lasse wäre dann das er in die For-Schleife reinspringt und eine oder mehrere Zahl(en) ausspuckt (irgendwas zwischen 0 und 20, solange eben bis der Wert größer 0 ist oder die Schleife endet). Problem ist das er nicht in die Schleife geht und gleich den letzten Debuglog (way, -1, auch wieder richtig) ausgibt und wieder stoppt. Warum übergeht er die Schleife?

Edit: Ist way=1 dann funktionierts, sprich diese Schleife wird ausgeführt und ich bekomme die Werte die ich brauche Question
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

BladeRunner

Moderator

BeitragFr, Okt 28, 2016 13:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Mach aus dem x ein Int anstatt eines Short und es klappt. Anscheinend gibt es da intern irgendwo beim Auswerten eine Bereichsverletzung und deswegen springt er drüber.
Wenn ich kleinere Startwerte einsetze geht es auch mit dem Short, was ebenso dafür spricht.
Irgendwo wird da eine negative Zahl kurzfristig erreicht, was Short ja nicht abbildet, die sind ja unsigned.

Überhaupt kann ich nur empfehlen nur von den Standardtypen INT und FLOAT abzuweichen wenn es wirklich unumgänglicg ist - wenn es zB um sehr große Datenmengen geht. Für einzelne Schleifenvariablen bleib besser beim Standardtyp.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Thunder

BeitragFr, Okt 28, 2016 20:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Short ist unsigned. Daher geht Step -1 nicht.
Ich schätze Mal, dass die -1 zu 65535 umgewandelt wird und dann ist das Problem, dass der Startwert größer ist als der Endwert. Also ist die Schleife vorbei, bevor sie anfing.

Ich kann BladeRunners Empfehlung nur beipflichten. Ich hätte allerdings Int und Double genannt (die meisten Floating funktinonen sind auf Double definiert, also gewinnst du nichts, wenn du die zusätzliche Genauigkeit wegschmeißt).
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit

Hubsi

BeitragSa, Okt 29, 2016 11:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Manchmal könnt ich echt selbst draufkommen... Vielen Dank Very Happy Die Datentypen haben mir nicht zu ersten mal einen kleinen Bug eingebracht. Vielleicht lern ichs doch nochmal Very Happy
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group