>> Thank you. You are quite right. This is the first time I have used Dynamic >> arrays and I didn't even think to calculate the allocation because I thought >> it was a theoretical number. Now I understand. >> Many thanks again >> Barrie >> > Barrie, > > You are correct!--it IS a theoretical number. The compiler doesn't care > to what size you dimension a dynamic array. Most of them are DIMmed to > _Maxlong, which is also more ram than any of us have on our machines. > > The problem is with the 2-D array. Dynamic arrays are limited to one > dimension. To get around this, I have always used a dynamic array of > dynamic handles and the following fn. I can send a short demo > illustrating its use if you like. > > e-e > =J= a y > " > > goto "End of DynamicXREF@.INCL" > '~'6 > #if 0 > > DYNAMIC XREF@ INCL > > by Jay Reeve > > April 27, 2001 > > #endif > '~'6 > /* > > Adding this INCL to your program allows you to store DYNAMIC ARRAY > handles and replace them in the array, just the way you do with XREF@. > > There are only two FN's here. > > FN ArrayCount is a simple 1-line utility you can use to get the index > of the top element in any dynamic array. You no longer need to keep > your own record of this! > > FN InstallHandle( DynamicArrayName, theHandle ) is what you use for > Creating and installing Dynamic handles in an array. > > Manipulation of dynamic handles MUST ALWAYS be done through this > FN to avoid loss or corruption of data. > > NOTE 1: Header data is only saved when a handle is > about to be replaced. That's why it is essential that > you ALWAYS use FN InstallXHandle for changing handles. > > NOTE 2: To create a new handle for your dynamic array, > use FN InstallXHandle( dynamicArray, _Nil ) > > You may immediately begin writing elements to the new > array. There will not be a valid handle in the array > until you have referenced (read or written) at least > one element in the array. > > Be sure to store the new handle after it is created: > myHandleArray&(ID) = myDynamicArray > > NOTE 3: Remember that these handles have extra data > appended when they are not installed in the array. > Be careful how you use them. > > When you want to use the handle for something, it is > usually best to install it in the array. > > While it is installed in the array, it is a normal > DYNAMIC array, and may be used as such. > > NOTE 4: DON'T FORGET to use FN InstallXHandle to create, > install and replace handles in a DYNAMIC array. Reverting > to the XREF@ syntax of myArray = myHandle can create big > problems. FN InstallXHandle has error checking for this, > but it is not foolproof! > > */ > '~'6 > _SaveHeaderSize = _AutoXREFSpare'12 > '~'6 > /* > > This FN actually returns the top index rather than the count, > which is 1 more. > > */ > > def fn ArrayCount( @theDynamicArray as ptr ) = > theDynamicArray.autoXREFCurr& - 1 > '~'6 > /* > > This FN appends header info to the handle being replaced (if any), and > removes > it from the incoming handle. > > If there is no incoming handle, it clears the header for creation of a > new one. > > */ > local mode > local fn InstallXHandle( @address as ptr, NewHndl& ) > 'Call as: FN InstallXHandle( ArrayName, HandleToInstall ) or > ' FN InstallXHandle( ArrayName, _Nil ) to initialize a new handle > dim OldHndl& > dim HSize& > dim OSErr > ' > oldHndl = address.autoXREFHndl& > long if oldHndl'Append header data to current handle before replacing it. > long if fn gethandleSize( oldHndl ) mod address.autoXREFMax& > stop "Handle-size error in FN InstallXHandle" > end if'Check for acceptable size > long if FN PtrAndHand (@address.autoXREFCurr&,oldHndl,_SaveHeaderSize) > stop "MemErr in FN InstallXHandle" > end if > end if > ' > long if NewHndl'Retrieve saved header data from handle > HSize = fn gethandlesize( NewHndl ) - _SaveHeaderSize Appearance buttons don't seem to work in FB^6 project mode. Does anyone know a way round this? Barrie