DIMENSION在操作上和语法上与DECLARE命令相同.
DIMENSION ArrayName1(nRows1 [, nColumns1]) [AS cType] [, ArrayName2(nRows2 [, nColumns2])] ...
参数
ArrayName1:数组名
通过包含多个数组名,可以用一条 DIMENSION 命令创建多个数组,例如,ArrayName2, ArrayName3, 等等。
nRows1 [, nColumns1] :指定要创建的数组大小。
使用 DIMENSION 创建的每个数组都必须指定大小。数组大小受可用内存的限制,特别是对于非常大的数组,可能会影响性能。确定您的电脑有足够的内存以容纳您的数组之最高上限。
要创建一维数组,应仅包含 nRows1。在此情况下,DIMENSION 用 nRows1 创建单列一维数组的行数。例如,下面命令创建一个 10 行 1 列的一维数组 gaArrayOne :
DIMENSION gaArrayOne(10)
要创建二维数组,应同时包含 nRows1 和 nColumns1。在此情况下,nRows1 指定数组的行数,nColumns1 指定数组的列数。下例创建一个 2 行 4 列的二维数组 gaArrayTwo :
DIMENSION gaArrayOne(2,4)
AS cType *NEW
为数组指定数据类型。使用 AS cType 子句,可以为数组定义并指定一个不同于 Variant 的数据类型。在设计期间 AS cType 语法不会出现在智能感应中;它仅用于运行时刻。例如,请参见示例部分的 示例 4。AS cType 子句仅用于传递数组到 COM 组件的时候。其他情况下,Visual FoxPro 忽略 AS cType 子句。如果指定了一个无效的 COM 数据类型,Visual FoxPro 自动默认为 VARIANT 类型。指定为 VARIANT 的数据只能通过引用和非强制类型值传递。
备注
在 DIMENSION 命令中可以使用中括号([])或圆括号(())括住表达式。例如,下面两行代码创建相同的数组:
DIMENSION gaArrayOne(10), gaArrayTwo[2,4], gaArrayThree(3,3) DIMENSION gaArrayOne[10], gaArrayTwo(2,4), gaArrayThree[3,3]
数组元素 一个数组的大小决定了数组中可以包含多少元素。每个数组元素可以存储一条信息。要确定数组中包含的元素总数,可用数组的行数(nRows1)乘以数组的列数(nColumns1)。
数组元素可以包含任何数据类型,第一次建立数组时,数组元素被初始化为假(.F.)。如果 SETCOMPATIBLE 命令设置为 FOXPLUS 或 OFF (默认),则可以使用 STORE 命令初始化数组的所有元素为相同值。下例将数组 gaArray 中的所有元素敷值为字符串"initial":
DIMENSION gaArray(10,3)
STORE 'initial' TO gaArray
注意 Visual FoxPro 数组是基于1的,数组的第一个元素、行、或列的编号都指定为 1。(其他程序设计语言中的数组可能是 基于0的;第一个元素、行、或列的编号都指定为 0)
数组下标 通过使用数组名和数组下标或指针,可以访问并操作数组中指定的元素。数组下标是识别数组中元素位置的一个唯一编号。数组中的第一个元素的下标总是 1。 如果数组是一维的,则数组使用一个下标来确定数组的行号。例如,一个一维数组第三行元素的下标就是 3。 如果数组是二维的,则数组使用两个下标来确定数组的元素。 第一个下标表示元素的行位置,第二个下标表示列位置。例如,一个二维数组第三行、第四列元素的下标就是(3,4)。您也可以使用单个下标来引用二维数组。 要从一对儿数组行和列下标中返回单个下标,可以使用 AELEMENT( )。要从单个下标中返回行和列下标,可以使用 ASUBSCRIPT( ) 函数。 有关下标的更多信息,请参见 ASUBSCRIPT( ) 函数。 重新定义数组维数 通过再次执行 DIMENSION,可以改变数组的大小和维数。数组大小可以增加或减少;一维数组可以改为二维的;二维数组也可以改为一维的。 注意
如果一个二维数组用较少的行或列重新定义,则用元素数定义减少的元素数,而不是用行或列数。例如,一个 10 * 10 数组重新定义为 10 * 7,则 71 及以上的所有元素都将丢失。更详细的信息,请参见AELEMENT( ) 函数。
如果增加数组中的元素数量,则原数组中所有元素的内容都复制到新的重新定义的数组中。添加的数组元素被初始化为假(.F.)。
若 SET COMPATIBLE 设置为 ON 或 DB4,当增加或减少数组大小的时候,数组中每个元素的值都被重新初始化为假(.F.)。
数组类型 *NEW 可以用参数或值传递一个类型数组。应该不明确指定 Visual FoxPro 对象,例如,CommandButton 应使用 Object 代替:
DIMENSION aObjects[] AS CommandButton && 不支持
DIMENSION aObjects[] AS Object && 推荐使用
如果 COM 服务是一个 Visual FoxPro 服务,则可以指定一个有效的 Visual FoxPro 对象,但如果不是 Visual FoxPro 服务,则将不识别此类型。servers will not recognize this type.
应该使用 COMARRAY( ) 为怎样传递数组到 COM 服务控制其它设置,例如,基于0(zero-based)、byref 等等。
当传递数组到运行 Microsoft .NET 框架服务时,必须明确的发出 COMARRAY(<object>, 10) 来用参数传递一个基于0的数组。倘若 .NET 框架要得到一个 byref 数组,interop 整理代码,但代替接收一个 byval 数组并失败。
个别类型的数组(scaler)不支持除了 Visual FoxPro COM 服务之外的 COM 服务。不能传递货币型(Currency)到 Microsoft .NET 框架服务运行中。
当运行 Microsoft .NET 框架服务,返回 System.Decimal 和 System.UInt16 类型时,它们改为 wchart_t, 映射为 Visual FoxPro 的 Decimal 数据类型。
示例 1:增加一个一维数组大小的结果。
如果在命令窗口中输入这些命令,则将是全局数组(PUBLIC) 。但如果复制这些代码到一个程序中运行,则将是私有数组(PRIVATE)。
如果数组中元素数量减少,则删除数组及其包含的任何数据。当一个一维数组重新定义为二维时,原来一维数组的内容以行优先的顺序,被复制到新数组中。
DIMENSION marray(2)
STORE 'A' TO marray(1)
STORE 'B' TO marray(2)
CLEAR
DISPLAY MEMORY LIKE marray
DIMENSION marray(4)
DISPLAY MEMORY LIKE marray
WAIT WINDOW
2:把一个一维数组改为一个二维数组。一维数组元素中的内容,被复制到新数组的第一行,然后是第二行,以此类推。增加的元素初始化为假(.F.)。
当一个二维数组改为一维时,原来二维数组的内容,以行优先的顺序被复制到新数组中。第一行的第一个元素变为一维数组中的第一个元素,第一行的第二个元素变为第二个元素,以此类推。
使用 ADEL( ) 或 AINS( ) 可以删除或插入数组的元素、行、列。使用 APPEND FROM ARRAY、 COPY TO ARRAY、 SCATTER、和 GATHER 在表记录和数组中传递数据。
3:创建一个二维数组并加载数据。显示数组元素及其所包含的数据。
DIMENSION sample(2,3)
STORE 'Goodbye' TO sample(1,2)
STORE 'Hello' TO sample(2,2)
STORE 99 TO sample(6)
STORE .T. TO sample(1)
CLEAR
DISPLAY MEMORY LIKE sample
4:*NEW
在 Visual FoxPro 中创建一个数组,然后通过参数传递到一个 Visual Basic COM 服务中,希望强制为 Long 型。编译 COM 组件之前,发出 FillIntArray 将失败,因为 aMyArray 是 Variant 型。但是编译之后,在定义数组为 Variant 型的 Visual Basic 类中包含一个定义,可以正确执行 FillIntArray ,如下:
* Visual FoxPro 代码
DIMENSION aMyArray [10] AS Long
lo.FillIntArray(@aMyArray, 100) && 传递给 Visual Basic COM 服务 br> ' 添加下列 Visual Basic 代码到 .CLS 文件,并编译为 COM 组件
Public Sub FillIntArray(ByRef aInts() As Long, iCount As Long)
ReDim aInts(1 to 100)
Dim ii As Interger
For ii = 1 to 100
AInts(ii) = ii
Next
End Sub