Will this work?
BlitzMax Forums/BlitzMax Programming/Will this work?
| ||
I am assuming arrays fill a continuous block of memory. Are ther any exceptions?
Local Data[10,10,5]
Clear(data[0,0,0],data.length,66)
Print data[0,0,0]
Print data[9,9,0]
Print data[9,9,4]
Function Clear(data0:Int Var,length,newValue=0)
'create pointer to first entry in integer array
Local int_Ptr:Int Ptr = Varptr Data0
size=length*4
'create bank in same memory area as array
Local DataBank:TBank=CreateStaticBank(int_Ptr,size)
'set array to new value
For i=0 To length-1
PokeInt DataBank,i*4,newValue
Next
End Function
|
| ||
| In the scenarios that use byte,short,int,float and long, then as long as your 'size = length * datatype_size' is using the correct 'datatype_size' then I would expect it to work. It won't work on an array of Objects though, which would be Types,Strings,Arrays and err... anything else based on Object :p It looks kind of naughty though. I assume you have a good reason to use the indirection? Otherwise what's wrong with using... |
| ||
| Compile Error: Incorrect number of array dimensions -> you access a multi-dimensional array (or "array of arrays" - never sure in which way BMax implements it) in a "single-dimension"-way bye Ron |
| ||
| I can't remember if I used Ng or legacy for that example, either way it worked here, so one of them is wrong :/ |
| ||
| It looks kind of naughty though. I assume you have a good reason to use the indirection? Otherwise what's wrong with using... I did this way so the function will work with integer arrays with any number of dimensions. |
| ||
| Why so convoluted? Heres my take on it, though it only works for Int arrays as is. SuperStrict Local a:Int[2,2,2] a[0,0,0] = 1 a[1,1,1] = 1 'MemClear a, GetArrayLength(a) * 4 ' probably the fastest for 0 Clear a, GetArrayLength(a) For Local z:Int = 0 Until a.Dimensions()[2] For Local y:Int = 0 Until a.Dimensions()[1] For Local x:Int = 0 Until a.Dimensions()[0] Print a[x,y,z] Next Next Next Function GetArrayLength:Int( o:Object) Local a:Int[] = Int[](o) If a Then Local length:Int = 1 For Local l:Int = EachIn a.Dimensions() length :* l Next Return length EndIf Return 0 EndFunction Function Clear( p:Int Ptr, length:Int, val:Int = 0) Local e:Int Ptr = p + length While p < e p[0] = val p :+ 1 Wend EndFunction |