Invalid Memory Access sur un code

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Invalid Memory Access sur un code

Message 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.
Jagang
Messages : 95
Inscription : sam. 10/janv./2009 18:55
Contact :

Message par Jagang »

Mémoire RAM insuffisante peut-être ?

Jagang
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

J'ai 2Go de mémoire.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message 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é...
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message 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 .
Répondre