Invalid Memory Access sur un code
Publié : sam. 28/mars/2009 18:34
Code : Tout sélectionner
DeleteFile(GetTemporaryDirectory()+ "filetest.txt")
If CreateFile(0, GetTemporaryDirectory()+ "filetest.txt")
For Inc = 0 To 4000
WriteStringN(0, LSet("", Random(255), "a"))
Next
CloseFile(0)
EndIf
ProcedureDLL.s ReadLine(bOS.b = #PB_Compiler_OS, *BufMem = 0, BufLen = 0)
Protected *ptrChar.Character, *ptrStr.Character, *ptrEof
Protected lLength.l
Protected cChar.c
Static MemOffset, MemLen, *MemBuf
Static bSystem.b
If *BufMem And BufLen
*MemBuf = *BufMem
MemLen = BufLen
bSystem = bOS
MemOffset = 0
EndIf
If *MemBuf And MemLen
*ptrChar = *MemBuf + MemOffset
*ptrEof = *MemBuf + MemLen
*ptrStr = *ptrChar
If MemOffset < MemLen
While *ptrChar< *ptrEof
cChar = *ptrChar\c
*ptrChar = *ptrChar + SizeOf(Character)
Select bSystem
Case #PB_OS_Linux ;{
If cChar = 10
Break
Else
lLength + 1
EndIf
;}
Case #PB_OS_MacOS ;{
If cChar = 13
Break
Else
lLength + 1
EndIf
;}
Case #PB_OS_Windows ;{
If cChar = 13
If *ptrChar< *ptrEof
cChar = *ptrChar\c
If cChar = 10
*ptrChar = *ptrChar + SizeOf(Character)
Break
Else
lLength + 1
EndIf
EndIf
Else
lLength + 1
EndIf
;}
EndSelect
Wend
MemOffset = *ptrChar - *MemBuf
ProcedureReturn PeekS(*ptrStr, lLength)
Else
ProcedureReturn Chr(1)
EndIf
Else
ProcedureReturn Chr(1)
EndIf
EndProcedure
Start.l = ElapsedMilliseconds()
Debug ElapsedMilliseconds()
Global Stream.l = ReadFile(#PB_Any, GetTemporaryDirectory()+ "filetest.txt")
If Stream
MemBufferLen = Lof(Stream)
If MemBufferLen
*MemBuffer = AllocateMemory(MemBufferLen)
If *MemBuffer
If ReadData(Stream, *MemBuffer, MemBufferLen) = MemBufferLen
EndIf
FreeMemory(*MemBuffer)
EndIf
EndIf
CloseFile(Stream)
Line.s = ReadLine(#PB_OS_Linux, *MemBuffer, MemBufferLen)
While Line <> Chr(1)
Line = ReadLine()
Debug Line
Wend
EndIf
Debug ElapsedMilliseconds()
Debug "Time #1 > " + Str(ElapsedMilliseconds() - Start)
Start.l = ElapsedMilliseconds()
Debug ElapsedMilliseconds()
Global Stream.l = ReadFile(#PB_Any, GetTemporaryDirectory()+ "filetest.txt")
If Stream
MemBufferLen = Lof(Stream)
If MemBufferLen
*MemBuffer = AllocateMemory(MemBufferLen)
If *MemBuffer
If ReadData(Stream, *MemBuffer, MemBufferLen) = MemBufferLen
FileContent.s = PeekS(*MemBuffer, MemBufferLen)
EndIf
CloseFile(Stream)
FreeMemory(*MemBuffer)
EndIf
EndIf
For Inc = 0 To CountString(FileContent, Chr(10))
Line = StringField(FileContent, Inc +1, Chr(10))
Line = RemoveString(Line, Chr(13))
Line = RemoveString(Line, Chr(10))
Debug Line
Next
EndIf
Debug ElapsedMilliseconds()
Debug "Time #2 > " + Str(ElapsedMilliseconds() - Start)
Mais par contre, j'ai un message d'erreur dés que je dépasse environ 1000 lignes.
Et c'est pourquoi je viens vers vous.