=====Clearing the contents of a structure=====
//by Jon Ripley, May 2007//\\ \\ The following routine will clear the contents of any structure passed to it:\\
REM Clear any structure (by Jon Ripley)
DEF PROC_ClearStruct(S{})
LOCAL E{}, F{}
DIM E{} = S{}, F{} = S{}
E{} = S{} : S{} = F{}
ENDPROC
\\ Call using:\\
PROC_ClearStruct( StructToBeCleared{} )
The **StructToBeCleared{}** can be any kind of structure.\\ \\ To clear the contents of a structure array you need to iterate through all elements calling "PROC_ClearStruct" for each, for a one dimensional array this code would suffice:\\
FOR I% = 0 TO DIM(StructToBeCleared{()},1)
PROC_ClearStruct(StructToBeCleared{(I%)})
NEXT I%
\\
----
==== How it works ====
//by Richard Russell, June 2007//\\ \\ The statements "LOCAL F{}" and "DIM F{} = S{}" create a local structure **"F{}"** with an identical format to the structure **"S{}"** but in which all the members are //empty//, that is all numeric members (including numeric arrays) are set to zero and all string members (including string arrays) are set to null (zero length) strings.\\ \\ The statement "S{} = F{}" copies the contents of **"F{}"** into **"S{}"**, thus clearing it. Superficially this would seem to be sufficient to accomplish the task, but there is a problem. As it states in the [[http://www.bbcbasic.co.uk/bbcwin/manual/bbcwin2.html#structcopy|Help documentation]] you should not copy structures containing **string** members, since only the //string descriptors// are copied rather than the string contents. In this particular case the effect of copying the empty structure **"F{}"** into **"S{}"** will be to cause the memory occupied by any strings it contains to be //leaked//, that is to be used up irreversibly. The eventual outcome may be an untrappable **No room** error, which is very serious.\\ \\ The straightforward solution to this problem is to empty any string members of **"S{}"** explicitly, before clearing the remainder of its contents. However this requires knowledge of the specific format of the structure, and in the case of a string array requires each element to be emptied individually (for example in a FOR...NEXT loop), which is inconvenient and relatively slow.\\ \\ The alternative method adopted in **PROC_ClearStruct** above relies on the fact that //BBC BASIC for Windows// and //BBC BASIC for SDL 2.0// automatically empty any strings, and string arrays, contained in a LOCAL structure (when the procedure or function in which that structure was declared is exited). This automatic 'clean up' is necessary to avoid a memory leak every time you use a LOCAL structure containing strings.\\ \\ By declaring a second LOCAL stucture **"E{}"**, and copying the contents of structure **"S{}"** into it, advantage can be taken of this automatic clean up process. Here is a breakdown of the main steps in PROC_ClearStruct with their functions annotated:\\ \\
LOCAL E{}, F{} : REM Declare local structures E{} and F{}
DIM E{} = S{}, F{} = S{} : REM Set E{} and F{} to have the same format as S{}
E{} = S{} : REM Copy stucture-to-be-cleared into local structure E{}
S{} = F{} : REM Copy empty structure F{} into S{}, hence clearing it
ENDPROC : REM Clean up any strings in E{}, freeing their memory