Seite 1 von 1
Invalid memory access bei ReadString
Verfasst: 27.05.2008 00:12
von Ty
Für den Fall, daß ich
ReadString im
Unicode Format auf eine größere Zeile mit mehr als 2049 Zeichen anwende, bekomme ich immer einen
Invalid memory access.
Code: Alles auswählen
; bug report PureBasic 4.20
#file$ = "Temp.txt"
#maxlen = 2048 * 4
#code = #PB_Unicode
; #code = #PB_Ascii
For bufferlength = 0 To #maxlen
writebuffer$ = Space(bufferlength)
CreateFile(0, #file$)
WriteString(0, writebuffer$, #code)
CloseFile(0)
OpenFile(0, #file$)
; [ERROR] Invalid memory access. (read error at address 0) for bufferlength >= 2050
readbuffer$ = ReadString(0, #code)
CloseFile(0)
Debug Str(bufferlength) + ", " + Str(Len(readbuffer$))
Next
Hat jemand einen schönen Workaround, damit ich die Datei doch noch einigermaßen schnell Zeile für Zeile auslesen kann? Das Zerhacken einer mit
ReadData eingelesenen Datei braucht bei mir so lange.

Wenn der Fehler in PureBasic behoben würde, wäre das noch viel besser.

Verfasst: 27.05.2008 00:39
von edel
Dir ist schon bewusst das du die Datei 16384 mal oeffnest?
Verfasst: 27.05.2008 01:19
von Ty
Der Quellcode oben ist nur ein Beispiel. Ich verarbeite Text-Dateien, die etwa 30 MByte groß sind. Da stehen nunmal mehrere Zeilen drin.
Der folgende Code hat weniger Dateizugriffe und endet bei mir auch in einen Invalid memory access
Code: Alles auswählen
; bug report PureBasic 4.20
#file$ = "Temp.txt"
#maxlen = 2048
#code = #PB_Unicode
; #code = #PB_Ascii
bufferlength = #maxlen
For x = 1 To 3
writebuffer$ = Space(bufferlength)
CreateFile(0, #file$)
WriteString(0, writebuffer$, #code)
CloseFile(0)
OpenFile(0, #file$)
; [ERROR] Invalid memory access. (read error at address 0) for bufferlengt >= 2050
readbuffer$ = ReadString(0, #code)
CloseFile(0)
Debug Str(bufferlength) + ", " + Str(Len(readbuffer$))
Next
Und für #code = #PB_Ascii arbeitet das Programm fehlerfrei.
Verfasst: 27.05.2008 01:25
von Ty
In dem Beispiel geht es hauptsächlich darum eine "Grenze" zu finden. Für
kann man für x gleiche mehrere hundert Durchläufe ohne Fehler machen.
Verfasst: 27.05.2008 01:30
von ts-soft
WriteString scheint nen Bug zu haben, funktioniert nicht mit Unicodestrings
im Ascii Modus, müßte es aber.
Verfasst: 27.05.2008 01:46
von Ty
Interessanter Ansatz:
Der folgende Code läuft auch mehrere Male, wenn die Temp.txt mit 2050 Zeichen schon existiert.
Code: Alles auswählen
; bug report PureBasic 4.20
#file$ = "Temp.txt"
#maxlen = 2050
#code = #PB_Unicode
; #code = #PB_Ascii
bufferlength = #maxlen
For x = 1 To 300
writebuffer$ = Space(bufferlength)
;CreateFile(0, #file$)
; WriteString(0, writebuffer$, #code)
;CloseFile(0)
OpenFile(0, #file$)
; [ERROR] Invalid memory access. (read error at address 0) for bufferlengt >= 2050
readbuffer$ = ReadString(0, #code)
CloseFile(0)
Debug Str(x) + ": " + Str(bufferlength) + ", " + Str(Len(readbuffer$))
Next
Entfernt man aber die Kommentierung vor
Createfile, WriteString, CloseFile kracht es sogar nach dem ersten Durchlauf beim Createfile.
Aber zum Lesen gehört bei mir auch das Schreiben.

Verfasst: 27.05.2008 04:13
von edel
Ty hat geschrieben:Der Quellcode oben ist nur ein Beispiel. Ich verarbeite Text-Dateien, die etwa 30 MByte groß sind. Da stehen nunmal mehrere Zeilen drin.
Mag ja sein, aber um mehrere Zeilen auszulesen ist das
garantiert der falsche Weg.
Verfasst: 27.05.2008 13:46
von Ty
ts-soft hat geschrieben:WriteString scheint nen Bug zu haben, funktioniert nicht mit Unicodestrings
im Ascii Modus, müßte es aber.
Jeep, der Bug liegt
nicht beim ReadString sondern beim Schreiben der Datei.
Selbst wenn man WriteString
Code: Alles auswählen
; WriteString(0, writebuffer$, #code)
WriteData(0, @writebuffer$, Len(writebuffer$) * 2)
durch WriteData ersetzt kommt es zu einem Invalid memory access.

Dann muß ich die Datei Wohl oder Übel nach Ascii konvertieren.

Verfasst: 27.05.2008 14:51
von DarkDragon
edel hat geschrieben:Ty hat geschrieben:Der Quellcode oben ist nur ein Beispiel. Ich verarbeite Text-Dateien, die etwa 30 MByte groß sind. Da stehen nunmal mehrere Zeilen drin.
Mag ja sein, aber um mehrere Zeilen auszulesen ist das
garantiert der falsche Weg.
Darum gehts ihm ja auch garnicht.
Die For-Schleife legt nur fest wieviele Character in die Datei geschrieben werden.
Wenn der Punkt erreicht ist wo der IMA kommt weiß man dann ab welcher länge es Probleme bereitet.
Und er öffnet die Dateien ja nicht so oft ohne sie zu schließen.
Das ist ein dynamisches Codebeispiel zur Bugsuche.
Verfasst: 27.05.2008 16:25
von PMV
Ich habs mal ins englische Forum geschrieben.
http://www.purebasic.fr/english/viewtop ... 571#245571
Wenn du im UNICODE-Modus kompilierst und die optionalen Parameter weg
lässt, gehts. Vielleicht ist das für dich eine Alternative.
MFG PMV