Page 1 sur 1

Invalid Memory Access sur un code

Publié : sam. 28/mars/2009 18:34
par Progi1984

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)

Voilà, j'essaie de trouver la meilleure facon de lire un fichier et je teste les fonctions.
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.

Publié : sam. 28/mars/2009 19:03
par Jagang
Mémoire RAM insuffisante peut-être ?

Jagang

Publié : sam. 28/mars/2009 19:03
par Progi1984
J'ai 2Go de mémoire.

Publié : sam. 28/mars/2009 19:24
par Ollivier
C'est sûr que si :
1) tu alloues de la mémoire (AllocateMemory() )
2) tu libères cette zone mémoire (FreeMemory() )
3) tu fouines dans cette zone mémoire qui n'existe plus

Ben... Il y a forcément une couille dans le pâté...

Publié : sam. 28/mars/2009 19:48
par Progi1984
Oh le con !!!!!

Désolé ! Merci, ca régle le problème !

Le résultat est là : http://www.purebasic.fr/french/viewtopic.php?t=9182 .