Seite 1 von 1

Seltsamer Bug oder mein Fehler?

Verfasst: 18.02.2006 23:33
von Hellhound66

Code: Alles auswählen

Structure _OBJECT
  *_NEXT._OBJECT
  *_PREVIOUS._OBJECT
  *OWNER._OBJECT
  *CHILD._OBJECT
  
  *SHOW
  *HANDLE_EVENT
  *DONE
  
  ID.l
  TYPE.l
  flags.l
EndStructure

Structure _BUFFER_OBJECT Extends _OBJECT
  *buffer                                 ;* *buffer ist ein Zeiger auf den Speicherbereich des Objektes.
  filename.s                              ;* filename ist der Name der dazugehörigen Datei
  offset.l                                ;* offset ist die Position in der Datei.
  Filehandle.l                            ;* Filehandle selbsterklärend.
  bufTYPE.l                               ;* bufTYPE ist der Buffertyp. Zum Beispiel #objTYPE_SPRITE, o.ä.
  *HEADER._HEADER                         ;* *HEADER ist ein Zeiger auf den Header des Objektes.
  CACHE.l                                 ;* CACHE und MCACHE sind TimeStamps zur Speicherverwaltung.
  MCACHE.l
  
  *AssignBuffer
  *AssignFilename
  *AssignBufferName
  *AssignID
  *SaveBuffer
  *LoadBuffer
  *LoadObject
  *FreeBuffer
  *FreeObject
  *ShadowObject
  *LoadHeader
  *SaveHeader
  *CreateHeader
  *UseBuffer
  *SetFlag
  *ClearFlag
  *Draw
  *DrawFit
  *RegisterObject
EndStructure

Structure _RESFILE Extends _BUFFER_OBJECT
  *ScanFile
  *AddObject
  *ScanNext
  *Defrag
  *DefragCallback
  *Deleteobject
  *REGISTERSUBOBJECT
  
  CurrentOffset.l
EndStructure

Structure _HEADER
  EXTENSION.b[3]                          ;* Erweiterung der Datei und gleichzeitiges Identifikationsmerkmal
  VERSION.b                               ;* Versionsnummer der Datei / Buffers
  ID.l                                    ;* Die ID des Buffers
  TYPE.l                                  ;* Der Buffertyp
  SIZE.l                                  ;* Die komprimierte Größe des Objektes
  flags.l                                 ;* 32 Bit für alle Fälle ^__^
  DESCRIPTION.b[30]                       ;* Objektbeschreibung / Name des Objektes
  UNPACKEDSIZE.l                          ;* reale Größe des Sprites
  Compression.b                           ;* Kompressionsfaktor (0-9) Standard = 9
  free.b[73]                              ;* freier Platz für weitere Informationen über das Objekt.
EndStructure

Procedure.l mAlloc(SIZE.l)
  UsedMemory+SIZE
  *buf = AllocateMemory(SIZE)
  ProcedureReturn *buf
EndProcedure

Procedure.l _resfile_ScanNext(*SELF._RESFILE)
  If *SELF\CurrentOffset=0
    *SELF\CurrentOffset = SizeOf(_HEADER)
  EndIf
  Debug *SELF\Filehandle
  Debug *SELF\CurrentOffset
  Debug Lof(*SELF\Filehandle)
  If IsFile(*SELF\Filehandle)
    If *SELF\CurrentOffset<Lof(*SELF\Filehandle)
      *HEADER._HEADER = mAlloc(SizeOf(_HEADER))
      FileSeek(*SELF\Filehandle,*SELF\CurrentOffset)
      Filehandle = *SELF\Filehandle  
      SizeofHeader = SizeOf(_HEADER)
      ReadData(Filehandle,*HEADER,SizeofHeader)
      ;*NewObj._BUFFER_OBJECT =  CallFunctionFast(*SELF\RegisterSubObject,*SELF,*HEADER)
      *SELF\CurrentOffset + SizeOf(_HEADER) + *HEADER\SIZE
      ProcedureReturn *HEADER\ID
    EndIf
  EndIf 
  ProcedureReturn #Null
EndProcedure



*obj._RESFILE = mAlloc(SizeOf(_RESFILE)); CreateRESObject(0)
*obj\filename = "TEST.RES"    ;Irgendwas, was größer als 128 Bytes ist.
*obj\Filehandle = OpenFile(#PB_Any,*obj\filename)
_resfile_ScanNext(*obj)


Das Programm wird abstürzen. Nur habe ich keine Ahnung warum. Als Datei könnt ihr jede beliebige Datei angeben. Der spinnt total und würfelt die lokalen Variablen durcheinander. Habe ich einen Fehler gemacht oder PB?

Lasst euch von den Structuren nicht ablenken. Der Kernfehler liegt in _resfile_Scannext(). Es wird bei ReadData abstürtzen.

Hintergrund: Beim laden der lokalen Variablen in _resfile_Scannext() führt er die Befehle einfach nicht aus. So bleibt zumindest bei mir filehandle.l immer 0, obschon in *SELF\filehandle das korrekte Handle steht. Wenn ich es zusammenfasse zu ReadData(*Self\filehandle,*Header,sizeof(_Header)) gibt er mir einen Speicherfehler.

/edit: Wie man unschwer erkennen kann, stammt der Code aus einem größeren Programm, also seht mir die Strukturen nach.

Verfasst: 18.02.2006 23:48
von Deeem2031
Also bei mir funktionierts...
Allerdings muss die Datei 256 Bytes groß sein und nicht 128. Schließlich liest du an Stelle "128", 128 Bytes aus, womit man dann an Stelle 256 angekommen ist.
Für mich siehts so aus als wäre

Code: Alles auswählen

  If *SELF\CurrentOffset=0 
    *SELF\CurrentOffset = SizeOf(_HEADER) 
  EndIf
sinnlos.

Verfasst: 18.02.2006 23:54
von Hellhound66
Da der Code aus dem Konzept gerissen ist, ist das nicht sinnlos, da der Header der Ressourcefile übersprungen werden muss um die Objektheader zu lesen. Aber wie gesagt, aus dem Konzept heraus gerissen. Cool, du bist der erste, bei dem es funktioniert.

Hroudtwolf bekommt den gleichen Fehler.

/edit: Wir reden aber von PB 4.0, oder?

Verfasst: 19.02.2006 00:00
von ts-soft
habs mit verschiedenen Dateien getestet, immer steigt er in Zeile 91 (ReadData) aus. PB4B3

Verfasst: 19.02.2006 00:06
von Hellhound66
Genau richtig, egal wie man ReadData anwendet.

Hier ein Screenshot:
http://hellhound66.bas-x.de/PB40Fehler.jpg

Verfasst: 19.02.2006 01:26
von Deeem2031
Habs nochma getestet, geht doch ned. (Weiß ned warum er vorher keinen fehler angezeigt hat)
Dann hab ich mal alles nacheinander auskommentiert und als ich "If *SELF\CurrentOffset<Lof(*SELF\Filehandle)" auskommentiert hab gings...
Sehr seltsam, werd mir mal den Asm-Output angucken.

Edit: Sieht ganz danach aus das Lof() ein quad zurückgibt, wobei der Vergleich dann Mist baut.

Edit2: Fred weiß anscheinend schon Bescheid. Ums zu umgehen kannst du das ergebnis von Lof() vorher in eine long-variable packen und mit der vergleichen.

Verfasst: 19.02.2006 03:01
von nco2k
@Deeem2031
> Sieht ganz danach aus das Lof() ein quad zurückgibt, wobei der Vergleich dann Mist baut.
jo, war mit Loc() und FileSize() das gleiche problem, hab mir schon gedacht, dass Lof() auch so einen fehler hat.

c ya,
nco2k

Verfasst: 19.02.2006 16:20
von Hellhound66
Ahja, klingt logisch. Danke.

Frage:
Sind die Fehler im geposteten Screenshot dann Folgefehler? Die lokalen Variablen Filehandle und SizeofHeader, haben nach der Zuweisung immer noch den Wert 0.

Verfasst: 20.02.2006 00:15
von Deeem2031
Ja, sind Folgefehler. Warscheinlich wird der Stackpointer verschoben, oder irgendwas dergleichen.