PokeQ problem, cannot find the error

Just starting out? Need help? Post your questions and find answers here.
User avatar
Erich
User
User
Posts: 49
Joined: Thu Sep 30, 2010 9:21 pm

PokeQ problem, cannot find the error

Post by Erich »

I must have potatoes on my eyes as they say in some countries, because I cannot find the error in the code below. When I run this on my 64bit machine with Unicode enabled, PB 5.41LTS on Linux Mint 17.2, I get

0
Hello world!
Whatever
210453397503


But the numbers should be 42 and 6724, of course. I've checked the index *stream\pos but just cannot see the problem. It must be something really simple. Does some of you perhaps spot the bug?

Code: Select all

DeclareModule MemoryHelpers
  #MH_DefaultBufferSize=104857600
  Structure MemoryStream
    pos.i
    buff.i
  EndStructure
  
  Declare NewMemoryStream(*stream.MemoryStream, size=#MH_DefaultBufferSize)
  Declare OpenAsMemoryStream(*stream.MemoryStream, *buffer)
  Declare SeekMemoryStream(*stream.MemoryStream, position.i)
  Declare ResetMemoryStream(*stream.MemoryStream)
  Declare IsMemoryStream(*stream.MemoryStream)
  Declare FreeMemoryStream(*stream.MemoryStream)
  Declare WriteMemoryString(*stream.MemoryStream, s.s)
  Declare WriteMemoryQuad(*stream.MemoryStream, v.q)
  Declare.s ReadMemoryString(*stream.MemoryStream)
  Declare.q ReadMemoryQuad(*stream.MemoryStream)
  Declare ReadMemoryStream(*stream.MemoryStream, length, file)
  Declare WriteMemoryStream(*stream.MemoryStream, file)
EndDeclareModule

Module MemoryHelpers
  EnableExplicit
  CompilerIf #PB_Compiler_Unicode
    #CHARLEN=2
  CompilerElse
    #CHARLEN=1
  CompilerEndIf
  
  Procedure NewMemoryStream(*stream.MemoryStream, size=#MH_DefaultBufferSize)
    Protected result
    *stream\buff=AllocateMemory(size)
    If *stream\buff>0
      *stream\pos=0
      result=#True
    EndIf
    ProcedureReturn result
  EndProcedure
  
  Procedure OpenAsMemoryStream(*stream.MemoryStream,*buffer)
    Protected result
    If *buffer
      *stream\buff=*buffer
      *stream\pos=0
      result=#True
    EndIf
    ProcedureReturn result
  EndProcedure
  
  Procedure SeekMemoryStream(*stream.MemoryStream, position.i)
    Protected result
    If position<=MemorySize(*stream\buff)
      *stream\pos=position
      result=#True
    EndIf
    ProcedureReturn result
  EndProcedure
  
  Procedure ResetMemoryStream(*stream.MemoryStream)
    *stream\pos=0
  EndProcedure
  
  Procedure IsMemoryStream(*stream.MemoryStream)
    Protected result
    If *stream\buff>0 And *stream\pos<=MemorySize(*stream\buff)
      result=#True
    EndIf
    ProcedureReturn result
  EndProcedure
  
  Procedure FreeMemoryStream(*stream.MemoryStream)
    Protected result
    If *stream\buff>0
      FreeMemory(*stream\buff)
      result=#True
    EndIf
    ProcedureReturn result
  EndProcedure
  
  Procedure AdjustMaybe(*stream.MemoryStream, len.i)
    Protected *buff2, result
    If *stream\buff>0 And *stream\pos+len<=MemorySize(*stream\buff)
      result=#True
    Else
      *buff2=AllocateMemory(MemorySize(*stream\buff)+#MH_DefaultBufferSize)
      If *buff2>0 And CopyMemory(*stream\buff, *buff2, *stream\pos)
        FreeMemory(*stream\buff)
        *stream\buff=*buff2
        result=#True
      EndIf
    EndIf
    ProcedureReturn result
  EndProcedure
  
  Procedure WriteMemoryString(*stream.MemoryStream, s.s)
    Protected result, le.q, blen
    le=Len(s)
    blen=le*#CHARLEN+#CHARLEN
    If AdjustMaybe(*stream, blen+8)
      PokeQ(*stream\buff+*stream\pos, le)
      PokeS(*stream\buff+*stream\pos+8, s)
      *stream\pos=*stream\pos+blen+8
      result=#True
    EndIf
    ProcedureReturn result
  EndProcedure
  
  
  Procedure.s ReadMemoryString(*stream.MemoryStream)
    Protected le.q, result.s
    le = PeekQ(*stream\buff+*stream\pos)
    If le>0
      result=PeekS(*stream\buff+*stream\pos+8, le)
      *stream\pos=*stream\pos+(le*#CHARLEN+#CHARLEN+8)
    EndIf
    ProcedureReturn result
  EndProcedure
  
  Procedure  WriteMemoryQuad(*stream.MemoryStream, v.q)
    Protected result
    If AdjustMaybe(*stream, 8)
      PokeQ(*stream\buff+*stream\pos, v)
      *stream\pos=*stream\pos+8
      result=#True
    EndIf
    ProcedureReturn result
  EndProcedure
  
  Procedure.q ReadMemoryQuad(*stream.MemoryStream)
    Protected v.q
    v=PeekQ(*stream.MemoryStream+*stream\pos)
    *stream\pos=*stream\pos+8
    ProcedureReturn v
  EndProcedure
  
  Procedure ReadMemoryStream(*stream.MemoryStream, length, file)
    Protected result
    If IsFile(file) And *stream\buff>0 And ReadData(file, *stream\buff, length)
      result=#True
    EndIf
    ProcedureReturn result
  EndProcedure
  
  Procedure WriteMemoryStream(*stream.MemoryStream, file)
    Protected result
    If IsFile(file) And *stream\buff>0 And WriteData(file, *stream\buff, *stream\pos-1)
      result=#True
    EndIf
    ProcedureReturn result
  EndProcedure
EndModule

CompilerIf #PB_Compiler_IsMainFile
  UseModule MemoryHelpers
  Define test.MemoryStream
  If NewMemoryStream(@test)
    WriteMemoryQuad(@test,42)
    WriteMemoryString(@test, "Hello world!")
    WriteMemoryString(@test, "Whatever")
    WriteMemoryQuad(@test, 6724)
    ResetMemoryStream(@test)
    Debug Str(ReadMemoryQuad(@test))
    Debug ReadMemoryString(@test)
    Debug ReadMemoryString(@test)
    Debug Str(ReadMemoryQuad(@test))
    FreeMemoryStream(@test)
  Else
    Debug "ERROR: Creating the memory stream failed."
  EndIf
CompilerEndIf
"I have never let my schooling interfere with my education." - Mark Twain
User avatar
Demivec
Addict
Addict
Posts: 4260
Joined: Mon Jul 25, 2005 3:51 pm
Location: Utah, USA

Re: PokeQ problem, cannot find the error

Post by Demivec »

You used the address of your structure and not its field's content.

Code: Select all

  Procedure.q ReadMemoryQuad(*stream.MemoryStream)
    Protected v.q
    ;v=PeekQ(*stream.MemoryStream+*stream\pos)
    v=PeekQ(*stream\buff+*stream\pos) ;Correction
    *stream\pos=*stream\pos+8
    ProcedureReturn v
  EndProcedure
User avatar
Erich
User
User
Posts: 49
Joined: Thu Sep 30, 2010 9:21 pm

Re: PokeQ problem, cannot find the error

Post by Erich »

Demivec wrote:You used the address of your structure and not its field's content.
Oh man, am I stupid! I've looked at it half a dozen times and didn't see that!

Thanks a lot!!! :D
"I have never let my schooling interfere with my education." - Mark Twain
Post Reply