84 of 158
78 3.22 Based Variables Based variables are a very powerful tool and their use is recommended for advanced programmers only. If used carelessly or without a complete understanding of their characteristics they may cause your program to malfunction in ways that are quite difficult to diagnose. A based variable is similar to a procedure parameter that is passed ByRef in the respect that no space is allocated for the data item. Rather, the location (i.e. the addess) of the based variable is specified using an integral expression that can be constant or computed at run-time. The effect that can be achieved using a based variable is similar to using an alias but a based variable is even more powerful because of the ability of the address to change at run time. The syntax for defining a based variable at the module level is shown below. {Public | Private | Dim} <name>[(<dim-list>)] As <type> Based <base-expr> As with normal variables, Dim has exactly the same effect as Private. Within a subroutine, a function or any block structure, a local based variable may be defined using the syntax shown below. Dim <name>[(<dim-list>)] As <type> Based <base-expr> In both cases the <base-expr> element is an integral expression that gives the base address of the variable. Some examples will help clarify the concept. Dim bv as Byte Based &H100 This defines a Byte variable whose address is a constant value. Dim addr as Integer Dim bv as Byte Based addr This defines a Byte variable whose address is given by the value of the Integer variable addr. Dim addr as Integer Dim sel as Byte Dim fv as Single Based addr + CInt(sel * 3) This defines a Single variable whose address is given by the value of an expression. Dim addr as Integer Dim bv as Byte Based addr.DataAddress This defines a Byte variable whose address is constant - the same as the address of the variable addr. Except for one important aspect, this has exactly the same effect as the following code. Dim addr as Integer Dim bv as Byte Alias addr The difference between an alias and a based variable is how they are handled by the compiler’s optimizer. Normally, when a variable’s value is referenced, the compiler’s optimizer attempts to deduce the variable’s value at that point and, if it is more efficient to do so, the compiler will generate code using the deduced value instead of the variable’s value in memory. However, if a variable is an Alias or has an Alias that refers to it, the compiler may not attempt to make this optimization. In contrast, the compiler does not attempt to determine if a based variable might be occupying the same space as a normal variable. Consequently, if a variable’s value is changed by assigning to a based variable that occupies the same space, the compiler may generate code that is incorrect. To circumvent this potential problem, you may instruct the compiler not to make any assumptions about the value of a variable by using the Volatile attribute as in the following example.