Memory Block

BlitzMax Forums/BlitzMax Programming/Memory Block

Pantheon(Posted 2006) [#1]
Hello,

Does anyone know if I can allocate a large block of memory, referenced by pointer. Then I can write Ints and Floats, etc into arbitary points within this block? I havent had any time to test this out myself or look it up because I havent been at my BMX computer for days.

Im asking this because im writing a small interprative emulator for my own virtual cpu and I need this for both speed and simplicity.

I know that banks have this ability but I realy want to try and avoid the overhead of the function calls.

Perhaps someone knows also if using this method will use the CPU cache efficiently, because I heard way back that BlitzBasic banks missed the cache.

Thanks


grable(Posted 2006) [#2]
MemAlloc should do that, but you can just as well use an array.


Dreamora(Posted 2006) [#3]
If you plan to use it within BM, don't use MemAlloc but TBank and CreateBank.


Pantheon(Posted 2006) [#4]
@Dreamora
Using TBank, will that not give me overhead on the function calls?

@grable
Can I just use MemAlloc to get a pointer to a block of memory then do this:

local a:float = 0.4432 ' example values
local b:int = 1232
pointer[ mem_address1 ] = a
pointer[ mem_address2 ] = b

Will that poke both ints and floats into the memory? If so then that is excactly what im after.


Pantheon(Posted 2006) [#5]
Ok, I just coded up a small sample:

Global pointer:Byte Ptr
pointer = MemAlloc( 255 )
MemClear( pointer, 255 )
pointer[0] = Int( 123 )
pointer[2] = Float( 1.45 )

This compiles and appears to be working. The problem is that as the float is placed into the memory location it is cast to a byte and therefore loses all precision.

Is there anyway around this. I realy dont want to resort to fixed point numbers for speed reasons.

Perhaps im just indexing the memory wrong for my read/write opperations.

Thanks


taxlerendiosk(Posted 2006) [#6]
Global pointer:Byte Ptr
pointer = MemAlloc( 255 )
MemClear( pointer, 255 )
Global intpointer:Int Ptr = Int Ptr(pointer)
Global floatpointer:Float Ptr = Float Ptr(pointer)
intpointer[0] = Int( 123 )
floatpointer[1] = Float( 1.45 )


Pantheon(Posted 2006) [#7]
Cool, thanks very much.
I had a look at the TBank source and this is the same way it was done there.