Seltsamer Bug oder mein Fehler?

Fragen und Bugreports zur PureBasic 4.0-Beta.
Hellhound66
Beiträge: 476
Registriert: 23.03.2005 23:19

Seltsamer Bug oder mein Fehler?

Beitrag 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.
Optimismus ist ein Mangel an Information.
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag 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.
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Hellhound66
Beiträge: 476
Registriert: 23.03.2005 23:19

Beitrag 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?
Optimismus ist ein Mangel an Information.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

habs mit verschiedenen Dateien getestet, immer steigt er in Zeile 91 (ReadData) aus. PB4B3
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Hellhound66
Beiträge: 476
Registriert: 23.03.2005 23:19

Beitrag von Hellhound66 »

Genau richtig, egal wie man ReadData anwendet.

Hier ein Screenshot:
http://hellhound66.bas-x.de/PB40Fehler.jpg
Optimismus ist ein Mangel an Information.
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag 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.
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
nco2k
Beiträge: 892
Registriert: 08.09.2004 23:13

Beitrag 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
~|__/
..o.o.. <--- This is Einkaufswagen. Copy Einkaufswagen into your signature to help him on his way to world domination.
Hellhound66
Beiträge: 476
Registriert: 23.03.2005 23:19

Beitrag 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.
Optimismus ist ein Mangel an Information.
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

Ja, sind Folgefehler. Warscheinlich wird der Stackpointer verschoben, oder irgendwas dergleichen.
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Gesperrt