KnowledgeBase Archive

An Archive of Early Microsoft KnowledgeBase Articles

View on GitHub

Q57709: "Typed Variable Not Allowed in Expression" Using Nested Arrays

Article: Q57709
Product(s): See article
Version(s): 7.00   | 7.00
Operating System(s): MS-DOS | OS/2
Keyword(s): ENDUSER | SR# S891220-141 buglist7.00 fixlist7.10 | mspl13_basic
Last Modified: 20-SEP-1990

Microsoft BASIC Professional Development System (PDS) version 7.00
allows static arrays as fields of user-defined TYPEs. This feature
allows programs to have complex data structures such as nested arrays
(a nested array is an array of user-defined-TYPE records that contain
an array).

However, compile-time errors occur using the ERASE statement and the
LBOUND and UBOUND functions on an array of arrays (nested in a
user-defined TYPE) when subscripted by means of a user-defined TYPE.
The BC.EXE compiler gives the messages "Syntax error" and "Typed
variable not allowed in expression." This problem occurs only when the
code is compiled with BC.EXE, not when it is compiled with QBX.EXE.

The array reference needed to produce the problem looks like the
following:

   PRINT UBOUND(array2(typedvariable.field).nestedarray1)

Microsoft has confirmed this to be a problem in BC.EXE in Microsoft
BASIC Professional Development System (PDS) version 7.00 for MS-DOS
and MS OS/2. This problem was corrected in BASIC PDS version 7.10.

You can work around this problem by using a non-TYPEd variable as the
subscript for the nested array (see the workaround example below).

Code Example
------------

The following code example illustrates the problem:

   TYPE Type1
      Array1(1 TO 1) AS INTEGER
   END TYPE
   TYPE Type2
      Number AS INTEGER
   END TYPE
   DIM Array2(1 TO 1) AS Type1
   DIM Var AS Type2
   Var.Number = 1
   PRINT LBOUND(Array2(Var.Number).Array1)
   '                   ^^^^^^^^^^ This TYPEd variable causes the error.

The following code example shows a workaround for the problem:

   TYPE Type1
      Array1(1 TO 1) AS INTEGER
   END TYPE
   TYPE Type2
      Number AS INTEGER
   END TYPE
   DIM Array2(1 TO 1) AS Type1
   DIM Var AS Type2
   Var.Number = 1
   Var2% = Var.Number
   PRINT LBOUND(Array2(Var2%).Array1)
   '                   ^^^^^ Non-TYPEd variable will work.

THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Copyright Microsoft Corporation 1986-2002.