[GELÖST] TSTream macht Ärger?

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

CO2

ehemals "SirMO"

Betreff: [GELÖST] TSTream macht Ärger?

BeitragFr, Mai 13, 2011 14:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
Ich habe eine Funktion verfasst, damit das WriteString von BlitzBasic mit BlitzMax gelesen werden kann. Die Funktion brauche ich für mein Packager-Tool. Sie wird verwendet, um die Dateinamen der in dem Package befindlichen Dateien herauszufinden und aufzulisten.
Leider erzeugt genau die Funktion den Fehler "Unhandled Exception: Error reading from stream", dabei wird die erste Zeile der Funktion markiert.
Der Fehler tritt aber erst auf, wenn die Funktion aufgerufen wird (via "Container -> öffnen"), und auch da nicht direkt, sie liest erst noch den ersten Dateinamen aus.
Hier ist einmal die Funktion: BlitzMax: [AUSKLAPPEN]
Function ReadString2:String(filename50:TStream)
Local stringsize:Int = ReadInt(filename50)
Local str:String = ReadString(filename50, stringsize)
Return str
End Function


Und hier einmal ihr aufruf:
BlitzMax: [AUSKLAPPEN]
Case 101 'öffnen
ChangeDir "C:\"
Local filter:String = "Text Files:co2,cox;All Files:*"
Local packagetoopen:String = RequestFile("Container öffnen", filter, 0, ".co2")
LoadPackage2(packagetoopen)


(wird über "LoadPackage2()" aufgerufen, wenn ich den Code noch schicken soll, tue ich das, bin mir aber zu 99% sicher, das es nicht an "LoadPackage2()" liegt!)

mfG,
CO2
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti
  • Zuletzt bearbeitet von CO2 am Fr, Mai 13, 2011 23:44, insgesamt 2-mal bearbeitet

Xeres

Moderator

BeitragFr, Mai 13, 2011 14:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Ein Stream ist kein Dateipfad.

Edit: LoadPackage2() wäre also sinnvoll zu posten.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

CO2

ehemals "SirMO"

BeitragFr, Mai 13, 2011 14:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Er öffnet ja auch keine Datei, sie wird vorher mit "ReadFile()" geöffnet, und erst danach wird die Funktion aufgerufen.
BlitzMax: [AUSKLAPPEN]
Function LoadPackage2(PackageFilePath:String) 

If row > 0 Then
For x = 0 To row
RemoveGadgetItem filelist, x
Next
row = 0
EndIf

Local PackageFile:TStream = ReadFile(PackageFilePath)

Local dateiname:String
Local dateigroesse:Int
Local PackagePos = 0

Repeat

dateiname = ReadString2(PackageFile)
dateigroesse = ReadInt(PackageFile)

AddFile(dateiname, dateigroesse, row, 0)

PackagePos = PackagePos + dateigroesse
SeekStream(PackageFile, PackagePos)

Until Eof(PackageFile)

CloseFile PackageFile

End Function

Das ist die Funktion.
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

BladeRunner

Moderator

BeitragFr, Mai 13, 2011 14:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Was mir direkt auffällt ist dass Du augenscheinlich ohne strict / superstrict arbeitest. Damit kaufst Du dir eine deutlich erhöhte Fehleranfälligkeit ein, und eine potentielle Verlangsamung deines Codes.
Ansonsten fiele mir - ohne Kenntnis deines Package-Formates- nur ein mittels einiger Debuglog-Ausgaben zu ermitteln was denn beim ersten Mal noch eingelesen wird, die Filepos etc. ausgeben zu lassen.
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

Xeres

Moderator

BeitragFr, Mai 13, 2011 14:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Bau an passenden Stellen Sicherheitsprüfungen ein:
BlitzMax: [AUSKLAPPEN]
Local PackageFile:TStream = ReadFile(PackageFilePath)
If PackageFile = Null Then RuntimeError("Kann '" + PackageFilePath+"' nicht öffnen!")
Das grenzt die Fehlerquelle ein.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Holzchopf

Meisterpacker

BeitragFr, Mai 13, 2011 15:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Also wenn der erste Dateinamen noch richtig ausgelesen werden kann, dann könnte es ja einfach sein, dass die Schleifen-Abbruch-Bedingung BlitzMax: [AUSKLAPPEN]
Until Eof(PackageFile)
nicht rechtzeitig erfüllt wird. Ich tippe mal darauf, dass der Fehler hier liegt BlitzMax: [AUSKLAPPEN]
		PackagePos = PackagePos + dateigroesse
SeekStream(PackageFile, PackagePos)


mfG
Holzchopf
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
 

CO2

ehemals "SirMO"

BeitragFr, Mai 13, 2011 15:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, werde mal Sicherheitsabfragen einbauen Danke euch!

EDIT: Habe meinen Code nun mit LOG - Einträgen gefüllt: BlitzMax: [AUSKLAPPEN]
Function LoadPackage2(PackageFilePath:String) 'FUNKTIONIERT NOCH NICHT!

Local logfile:TStream = WriteFile("LOG.txt")

If row > 0 Then
For x = 0 To row
RemoveGadgetItem filelist, x
Next
row = 0
EndIf

Local PackageFile:TStream = OpenFile(PackageFilePath)
If packagefile = Null Then
WriteLine(logfile, "konnte Datei nicht öffnen!")
Else
WriteLine(logfile, "Package geöffnet!")
WriteLine(logfile, "")
EndIf

Local dateiname:String
Local dateigroesse:Int
Local PackagePos = 0

Repeat

dateiname = ReadString2(PackageFile)
WriteLine(logfile, "Dateiname ausgelesen (" + dateiname + ")")
dateigroesse = ReadInt(PackageFile)
WriteLine(logfile, "Dateigröße ausgelesen (" + dateigroesse + ")")
AddFile(dateiname, dateigroesse, row, 0)
WriteLine(logfile, "Datei hinzugefügt!")

PackagePos = PackagePos + dateigroesse
WriteLine(logfile, "Aktuelle Position im Package: " + PackagePos)
SeekStream(PackageFile, PackagePos)
WriteLine(logfile, "Springe zur nächsten Datei!")
WriteLine(logfile, "")

Until Eof(PackageFile)

WriteLine(logfile, "Ende")

CloseFile PackageFile

CloseFile logfile

End Function


Nur wird nichts in die Datei reingeschrieben, d.h.: Der fehler muss noch vor dem ersten durchlauf der Schleife kommen.
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

Hummelpups

BeitragFr, Mai 13, 2011 16:01
Antworten mit Zitat
Benutzer-Profile anzeigen
oder es komt nicht zum closefile weil erst dann die geschriebenen lines gespeichert
werden.

warum machst du auch hier wieder nicht das, was dir geraten wird und
nutzt debuglog?

Meine Güte
blucode - webdesign - Ressource - NetzwerkSim
BlitzBasic 2D - BlitzMax - MaxGUI - Monkey - BlitzPlus

mpmxyz

BeitragFr, Mai 13, 2011 16:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich möchte hier auch noch einmal Werbung für ein Modul machen:
https://www.blitzforum.de/foru...hp?t=36857
Damit kannst du feststellen, was mit dem Stream gemacht wird.
Ein weiterer Hinweis: Debug-Meldungen solltest du immer mit "FlushStream" 'bestätigen'!
Normalerweise werden die Daten nämlich gepuffert und gehen bei einem Programmabsturz verloren.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer
 

CO2

ehemals "SirMO"

BeitragFr, Mai 13, 2011 23:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, das Mysterium ist gelöst! Es lag anscheinend an "SeekStream()", habe es durch eine andere (evtl. weniger schnelle) methode ersetzt: BlitzMax: [AUSKLAPPEN]
Function LoadPackage2(PackageFilePath:String) 'FUNKTIONIERT!

If row > 0 Then
ClearGadgetItems(filelist)
row = 0
EndIf

Local PackageFile:TStream = ReadFile(PackageFilePath)
DebugLog "File geöffnet!"

Local dateiname:String
Local dateigroesse:Int
Local PackagePos = 0

Repeat

dateiname = ReadString2(PackageFile)
DebugLog "Dateiname: " + dateiname
dateigroesse = ReadInt(PackageFile)
DebugLog "Dateigröße: " + dateigroesse
AddFile(dateiname, dateigroesse, row, 0)
DebugLog "Datei hinzugefügt"
PackagePos = PackagePos + dateigroesse
DebugLog "Position: " + PackagePos
Local kontrolle = 0
Repeat 'Hier war vorher SeekStream()
ReadByte(PackageFile)
kontrolle = kontrolle + 1
Until kontrolle = dateigroesse Or Eof(PackageFile)

Until Eof(PackageFile)

DebugLog "Fertig!"

CloseFile PackageFile

End Function


Ich danke allen für die Tatkräftige Hilfe!

mfG,
CO2
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

mpmxyz

BeitragSa, Mai 14, 2011 13:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du die Leseposition der beiden Varianten vergleichen würdest, würdest du feststellen, dass du einfach nur die Sprungposition falsch berechnest hast.
Hier springst du relativ zur aktuellen Position um dateigroesse Bytes nach hinten:
BlitzMax: [AUSKLAPPEN]
		Local kontrolle = 0
Repeat 'Hier war vorher SeekStream()
ReadByte(PackageFile)
kontrolle = kontrolle + 1
Until kontrolle = dateigroesse Or Eof(PackageFile)

Da du hier die vorherigen Lese-Befehle nicht beachtest, springst du im ersten Durchlauf auf die absolute Position "dateigroesse":
BlitzMax: [AUSKLAPPEN]
		PackagePos = PackagePos + dateigroesse
WriteLine(logfile, "Aktuelle Position im Package: " + PackagePos)
SeekStream(PackageFile, PackagePos)

Richtig wäre "StreamPos(PackageFile)+dateigroesse" als Sprungposition, wenn du relativ springen möchtest:
BlitzMax: [AUSKLAPPEN]
SeekStream(PackageFile, StreamPos(PackageFile)+dateigroesse)

-> Es lag nicht an SeekStream, sondern an der Positionsberechnung.
Es ist schon eher selten, dass man in BlitzMax auf einen Fehler dieser Art stößt. Wink
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Holzchopf

Meisterpacker

BeitragSa, Mai 14, 2011 19:00
Antworten mit Zitat
Benutzer-Profile anzeigen
CO2 hat Folgendes geschrieben:
Ok, das Mysterium ist gelöst!

Ja, und zwar schon seit meinem Posting hier, nachdem ich meine heilige Kristallkugel eingesetzt hatte und so den Fehler sah Rolling Eyes ne Quatsch Wink ich dachte der Fehler sei offensichtlich, deshalb hatte ich nicht weiter erklärt, worin ich den Fehler vermutete.
CO2 hat Folgendes geschrieben:
Es lag anscheinend an "SeekStream()"

Kleiner Tipp: Nein Wink mpmxyz hat dir die Lösung schon gegeben, aber ich möchte dir trotzdem noch kurz sagen, wo der Fehler wirklich lag (ok, ich kenne zwar das Dateiformat nicht, aber ich denke, dass ich mir das so halbwegs erahnen kann. Wichtig wäre übrigens auch, zu wissen, was AddFile macht und was die Variable row ist):

Du liest einen String von Position x mit der Länge n Bytes, danach ein Integer (4 Bytes), dann die Datei (N Bytes) oder vllt. überspringst du die Datei auch (keine Ahnung, was AddFile macht) - also hast du von x aus n+4+N Bytes gelesen. Der nächste Eintrag (vermute ich) liegt demnach an Position x+n+4+N. Du springst aber an Position x+N, also n+4 Bytes zu wenig weit - an eine Stelle, wo "ReadString2" keinen schlauen String antreffen wird.

Ich hoffe, das war ausführlich und verständlich genug...

mfG
Holzchopf
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
 

CO2

ehemals "SirMO"

BeitragSo, Mai 15, 2011 4:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, nochmal danke für die erklärung Wink

Zur Erklärung: Ich benutze diese Lib. Die Funktion AddFile() fügt einfach eine neue "datenreihe" hinzu, d.h.: es erstellt einen neuen eintrag in der filelist.
row ist einfach die variable der zeile. sie steht zu anfang auf 0. wird eine datei eingefügt, wird es in reihe 0 reingeschrieben, danach erhöht sich die variable row auf 1, usw.

mfG,
CO2
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group