Invalid memory access bei ReadString

Hier werden, insbesondere in den Beta-Phasen, Bugmeldungen gepostet. Das offizielle BugForum ist allerdings hier.
Ty
Beiträge: 8
Registriert: 26.04.2005 10:11
Wohnort: Baden-Württemberg

Invalid memory access bei ReadString

Beitrag 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. :cry:
Wenn der Fehler in PureBasic behoben würde, wäre das noch viel besser. :D
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Dir ist schon bewusst das du die Datei 16384 mal oeffnest?
Ty
Beiträge: 8
Registriert: 26.04.2005 10:11
Wohnort: Baden-Württemberg

Beitrag 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.
Ty
Beiträge: 8
Registriert: 26.04.2005 10:11
Wohnort: Baden-Württemberg

Beitrag von Ty »

In dem Beispiel geht es hauptsächlich darum eine "Grenze" zu finden. Für

Code: Alles auswählen

#maxlen = 2047
kann man für x gleiche mehrere hundert Durchläufe ohne Fehler machen.
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 »

WriteString scheint nen Bug zu haben, funktioniert nicht mit Unicodestrings
im Ascii Modus, müßte es aber.
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
Ty
Beiträge: 8
Registriert: 26.04.2005 10:11
Wohnort: Baden-Württemberg

Beitrag 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. :(
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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.
Ty
Beiträge: 8
Registriert: 26.04.2005 10:11
Wohnort: Baden-Württemberg

Beitrag 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. :cry:
Dann muß ich die Datei Wohl oder Übel nach Ascii konvertieren. :(
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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.
:wink:
Und er öffnet die Dateien ja nicht so oft ohne sie zu schließen.

Das ist ein dynamisches Codebeispiel zur Bugsuche.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag 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
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Antworten