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.