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 |