GLBasic forum

Main forum => Bug Reports => Topic started by: BizarroFreak_9991 on 2011-Apr-27

Title: Readbyte Fehler?
Post by: BizarroFreak_9991 on 2011-Apr-27
Hallo!
Ich habe mich vor kurzem darüber aufgeregt, wie groß die "üblichen" Bilddateien sind.
Habe mich also gleich einmal an die Arbeit gemacht. Nun habe ich den 2. wichtigsten Teil des Codes fertig, doch irgendwie will er nicht funktionieren.
der Code sieht ungefähr folgendermaßen aus:

       
Code (glbasic) Select
Mehrere Variablen werden mit DIM deklariert
WHILE temp% = 0
        COLORS% = COLORS% + 1 (Anzahl der Durchläufe beginnend mit 1)
       
        Immer wieder READBYTE 1, Var%
        gefolgt von     IF Var% < 0 THEN Var% = Var% + 256 (Da ja die Werte als signed ausgelesen werden)

        temp% = ENDOFFILE (1)
        WEND


Beim kompilieren kommt kein Error, alles läuft. Eigentlich...
Wird die Schleife einmal durchlaufen, funktioniert alles ganz reibungslos.
Wird sie jedoch zwei- oder mehrmals durchlaufen, bricht das Programm IMMER bei EINEM bestimmten READBYTE-Befehl ab.(schließt sich sozusagen ohne Rückmeldung selbst)
Das passierte bisher, wenn entweder die gefragte Variable nicht existiert,
                                            oder die Datei zu Ende ist.
Jetzt habe ich aber durch Schrittweises Debuggen sichergestellt, dass nichts davon der Fall ist.
Ich bin mit meinem Latein da zu Ende.


Hier nochmal der gesamte Ausschnitt:

       
Code (glbasic) Select
DIM MCOLOR%[0][3]
DIM MCOLOR%[0][3]
DIM STARTPOS%[0]
DIM WARP%[0][0]
DIM WARPANZAHL%[1]
WARPANZAHL%[0] = 0
DIM JUMP%[0][0]
DIM JUMPANZAHL%[1]
JUMPANZAHL%[0] = 0
DIM ENDPOS%[0]
DIM POS%[0][0]
hh% = 0
hw% = 0
hj% = 0

WHILE temp% = 0

COLOURS% = COLOURS% + 1

REDIM MCOLOR[COLOURS%][3]
REDIM STARTPOS%[COLOURS%]
REDIM WARP%[COLOURS%][hw%+2]
REDIM JUMP%[COLOURS%][hj%+2]
REDIM ENDPOS%[COLOURS%]
REDIM POS%[COLOURS%][hh%]

COL% = COLOURS%-1
READBYTE 1, MCOLOR%[COL%][0]
IF MCOLOR%[COL%][0] < 0 THEN MCOLOR%[COL%][0] = MCOLOR%[COL%][0] + 256
READBYTE 1, MCOLOR%[COL%][1]
IF MCOLOR%[COL%][1] < 0 THEN MCOLOR%[COL%][1] = MCOLOR%[COL%][1] + 256
READBYTE 1, MCOLOR%[COL%][2]
IF MCOLOR%[COL%][2] < 0 THEN MCOLOR%[COL%][2] = MCOLOR%[COL%][2] + 256
READBYTE 1, STARTPOS% [COL%]
IF STARTPOS% [COL%] < 0 THEN STARTPOS% [COL%] = STARTPOS% [COL%] + 256
WHILE i = 0

READBYTE 1, WARP%[COL%][WARPANZAHL%[COL%]]
IF WARP%[COL%][WARPANZAHL%[COL%]] < 0 THEN WARP%[COL%][WARPANZAHL%[COL%]] = WARP%[COL%][WARPANZAHL%[COL%]] + 256
IF WARP%[COL%][WARPANZAHL%[COL%]] = 0
i = 1
ELSE
WARPANZAHL%[COL%] = WARPANZAHL%[COL%] + 1
REDIM WARP%[COLOURS%][WARPANZAHL%[COL%]*2]
READBYTE 1, WARP%[COL%][WARPANZAHL%[COL%]-1]
IF WARP%[COL%][WARPANZAHL%[COL%]-1] < 0 THEN WARP%[COL%][WARPANZAHL%[COL%]-1] = WARP%[COL%][WARPANZAHL%[COL%]-1] + 256
ENDIF

WEND
i = 0

WHILE i = 0

READBYTE 1, JUMP%[COL%][JUMPANZAHL%[COL%]]    //   <-HIER!
IF JUMP%[COL%][JUMPANZAHL%[COL%]] < 0 THEN JUMP%[COL%][JUMPANZAHL%[COL%]] = JUMP%[COL%][JUMPANZAHL%[COL%]] + 256
IF JUMP%[COL%][JUMPANZAHL%[COL%]] = 0
i = 1
ELSE
JUMPANZAHL%[COL%] = JUMPANZAHL%[COL%] + 1
REDIM JUMP%[COLOURS%][JUMPANZAHL%[COL%]*2]
READBYTE 1, JUMP%[COL%][JUMPANZAHL%[COL%]-1]
IF JUMP%[COL%][JUMPANZAHL%[COL%]-1] < 0 THEN JUMP%[COL%][JUMPANZAHL%[COL%]-1] = JUMP%[COL%][JUMPANZAHL%[COL%]-1] + 256
ENDIF

WEND
READBYTE 1, ENDPOS%[COL%]
IF ENDPOS%[COL%] < 0 THEN ENDPOS%[COL%] = ENDPOS%[COL%] + 256
ENDPOS%[COL%] = ENDPOS%[COL%] + 1
h% = 0
FOR i = 1 TO ENDPOS% [COL%] STEP 1
REDIM POS% [COL%][h% + 1]
READBYTE 1, POS% [COL%][h%]
IF POS% [COL%][h%] < 0 THEN POS% [COL%][h%] = POS% [COL%][h%] + 256
h% = h% + 1
NEXT
WHILE h% > hh%
hh% = hh% + 1
WEND
temp% = ENDOFFILE (1)

WEND


P.S.:Sorry, erster Post, tut mir also leid wenns ein wenig  :offtopic: ist, oder im falschen Forum gepostet wurde :(
Title: Re: Readbyte Fehler?
Post by: BumbleBee on 2011-Apr-27
Hallo
Quote
  Ich würde auch gerne den gesamten Code in einen Spoiler geben, weiß aber nicht, wie das geht.

So, hab dir den Code zwischen die eckigen Klammern gesetzt. Jetzt ist's übersichtlicher.  ;) Zu deinem Problem kann ich dir noch nichts sagen ich komm  nämlich gerade aus der Spätschicht und bin noch völlig neben der Kappe.  ;) Aber es gibt noch andere nette Leute hier die dir gerne helfen bis ich wieder voll da bin.  =D

Cheers
Title: Re: Readbyte Fehler?
Post by: Kitty Hello on 2011-Apr-28
ENDOFFILE liefert TRUE, wenn das Ende erreicht wurde. Das musst Du _vor_ dem RADBYTE machen. Oder?
Title: Re: Readbyte Fehler?
Post by: Schranz0r on 2011-Apr-28
Ne Gernot ich denke er macht das so schon richtig.
Lesen der Daten und wenn EndOfFile erreicht ist, wird die While-Schleife abgebrochen.

Sehe ich als korrekt an!

Title: Re: Readbyte Fehler?
Post by: BizarroFreak_9991 on 2011-Apr-28
Hallo!
thx an BumbleBee für dieses Code-wie auch immer man das nennt.

QuoteENDOFFILE liefert TRUE, wenn das Ende erreicht wurde. Das musst Du _vor_ dem RADBYTE machen. Oder?

NORMALERWEISE ja, danke für den Tipp!
JEDOCH habe ich hier ein eigenes Dateiformat selbst mit dem Hexeditor zusammengestellt.
1. Habe ich ALLE READBYTEs mit PRINT ausgeben lassen, und kein Byte wurde übersprungen, also geht dich Datei doch noch weiter(?).
2. Ich habe nochmal schnell durchgeprüft: Bei der besagten Stelle gibt ENDOFFILE 0 zurück, so wie überall auch.

Konklusio: Ich HABE alles überprüft, der Befehl bricht einfach das Programm ab :(. READBYTE hat 2 Argumente: 1. Channel, 2. Variable. Wenn ich beide austausche bricht das Programm noch immer ab(natürlich habe ich auf channel 2 auch noch eine Datei geladen).  HILFE! :(:(:(:(:(
Title: Re: Readbyte Fehler?
Post by: BizarroFreak_9991 on 2011-Apr-28
Kitty Hello (oder etwa Gernot?) hatte schon recht, ENDOFFILE wird erst AM ENDE EINES DURCHLAUFES verwendet, eigentlich sollte es immer wieder überprüft werden.
Das Problem ist nur, dass abgebrochen wird OHNE dass die Datei zu ende ist! :(
Nochmal thx allen, die mitgedacht haben! (und hoffentlich noch weiter mitdenken werden!)
Title: Re: Readbyte Fehler?
Post by: Kitty Hello on 2011-Apr-28
Kleines Beispielprojekt hochladen. Sorry.
Title: Re: Readbyte Fehler?
Post by: Schranz0r on 2011-Apr-28
Ob nun:


Code (glbasic) Select
WHILE temp = 0
...
temp = ENDOFFILE(1)
WEND

oder

Code (glbasic) Select
WHILE ENDOFFILE(1) = 0

WEND


ist doch vollkommen egal.... als temp wird es doch immer überprüft, ob nun das beispiel oben oder unten, der Call kommt immer nach READBYTE...
Title: Re: Readbyte Fehler?
Post by: Kitty Hello on 2011-Apr-28
Jo. Scheint echt ein Bug zu sein.
Title: Re: Readbyte Fehler?
Post by: BizarroFreak_9991 on 2011-May-07
HALLO!

Habe den Code jetzt insgesamt 17,4 mal umgeschrieben, sodass nun JUMPANZAHL%[] und WARPANZAHL%[] nicht mehr gebraucht werden.
Danach hat es plötzlich funktioniert  :blink: .
Zwar habe ich keinen blassen Schimmer, wieso es vorher nicht funktioniert hat( O_O ),
aber 10 Befehle weniger und ein funktionierendes Programm sind ja nicht so schlecht ;).
Jetzt muss sich also niemand mehr den Kopf zerbrechen! =D
P.s.: Der Fehler lag jedenfalls sicher nicht an GLBasic.