Создает одномерный или двумерный массив переменных.

Замечание:
DIMENSION идентична по действию и схожа по синтаксису с командой DECLARE. Для получения дальнейших сведений смотрите Команда DECLARE.

DIMENSION ArrayName1(nRows1 [, nColumns1]) [AS cType]
[, ArrayName2(nRows2 [, nColumns2])] ...

Параметры

ArrayName1

Указывает имя массива.
Подсказка:
Вы можете создавать множество массивов посредством одной команды DIMENSION, указывая нужные имена массивов, например, ArrayName2, ArrayName3 и так далее.

nRows1 [, nColumns1]

Указывает размер создаваемого массива.
Подсказка:
Вы должны указывать размер каждого массива, который вы создаете командой DIMENSION. Размер массива может быть ограничен доступной памятью, что влияет на производительность, особенно для больших массивов. Будьте уверены, что ваш компьютер имеет достаточно памяти для размещения всего массива.

Для того, чтобы создать одномерный массив, задайте только nRows1. В этом случае команда DIMENSION использует nRows1 для создания соответствующего числа строк в одномерном массиве, т.е. в массиве, имеющем только одну колонку. Например, следующая команда создает одномерный массив с именем gaArrayOne, содержащий десять строк и одну колонку:
  Скопировать код
DIMENSION gaArrayOne(10)
Для создания двумерного массива задайте nRows1 и nColumns1. В этом случае nRows1 указывает количество строк в массиве, а nColumns1 - количество колонок. В следующем примере создается двумерный массив с именем gaArrayTwo, содержащий две строки и четыре колонки:
  Скопировать код
DIMENSION gaArrayTwo(2,4)
AS cType

Указывает тип данных в массиве. Используя опцию AS cType, вы можете определить и указать тип данных, отличающийся от принятого для массивов типа Variant. Опция AS cType не поддерживается IntelliSense в режиме разработки; она предназначена для использования во время исполнения кода. Рассмотрите Пример 4 в разделе Примеры. Опция AS cType используется лишь при передаче массива в COM-объект. В остальных случаях Visual FoxPro игнорирует опцию AS cType. Если вы определите тип данных, который не является допустимым для COM, Visual FoxPro автоматически использует тип VARIANT, принятый по умолчанию. Данные типа VARIANT можно передавать только по ссылке (by reference) и они не имеют строгой типизации. В нижеследующей таблице перечислены допустимые типы для COM.

типы данных VFP Типы в IntelliSense Дружественное имя COM COM Typelib Системный тип .NET Тип XSD (SOAP)

Boolean

Logical

Boolean

VARIANT_BOOL (VT_BOOL)

System.Boolean

boolean

Byte

Number

Byte

unsigned char (VT_UI1)

System.Byte

 

Character *

String

String

BSTR (VT_BSTR)

System.String

string

Currency *

Currency

Currency

CURRENCY (VT_CY)

 

 

Date

Date

Date

DATE (VT_DATE)

System.DateTime

dateTime

DateTime

Date

Date

DATE (VT_DATE)

System.DateTime

dateTime

Decimal *

Number

 

wchar_t (VT_DECIMAL)

System.UInt16

 

Double

Number

Double

double (VT_R8)

System.Double

double

Float

 

Variant

VARIANT (VT_VARIANT)

System.Object

anyType

Integer

Number

Long

long (VT_I4)

System.Int32

int

Logical

Logical

Boolean

VARIANT_BOOL (VT_BOOL)

System.Boolean

boolean

Long

Number

Long

long (VT_I4)

System.Int32

int

Memo

 

Variant

VARIANT (VT_VARIANT)

System.Object

anyType

Number

Number

Double

double (VT_R8)

System.Double

double

Object

Object

Object

IDispatch* (VT_DISPATCH)

System.Object

 

Short

Number

Long

long (VT_I4)

System.Int32

int

Single *

Number

Single

single (VT_R4)

System.Single

 

String

String

String

BSTR (VT_BSTR)

System.String

string

Variant

 

Variant

VARIANT (VT_VARIANT)

System.Object

anyType

Void

VOID

Void

void (VT_VOID)

System.IntPtr

 

Array

Array

 

SAFEARRAY(type)

Type[]

Base64Binary

Примечания

Вы можете заключать выражения в DIMENSION в круглые или в квадратные скобки. Например, следующие два строки кода описывают одни и те же массивы:

  Скопировать код
DIMENSION gaArrayOne(10), gaArrayTwo[2,4], gaArrayThree(3,3)
DIMENSION gaArrayOne[10], gaArrayTwo(2,4), gaArrayThree[3,3]

Элементы массива  Размер массива определяется количеством содержащихся в нем элементов. В каждый элемент массива можно поместить одну частицу информации. Для определения общего количества элементов в массиве умножьте количество строк (nRows1) в массиве на количество столбцов (nColumns1) в нем.

Элементы массива могут содержать данные любого типа и первоначально (при создании массива) они инициализируются значением Ложно (.F.). Вы можете инициализировать элементы массива одинаковым значением при помощи команды STORE, если действует установка SET FOXPLUS OFF (по умолчанию). В следующем примере строка "initial" инициализирует массив gaArray:

  Скопировать код
DIMENSION gaArray(10,3)
STORE 'initial' TO gaArray

Для получения сведений об ограничениях на количество элементов в массиве смотрите Системные ограничения Visual FoxPro.

Замечание:
Нумерация элементов в массивах Visual FoxPro начинается с единицы - как для строк, так и для столбцов. (В других языках программирования нумерация элементов в массивах может начинаться с нуля).
 

Прим.переводчика. В ряде языков программирования нумерация элементов в массиве может начинаться с любого значения.

Индексы в массиве Вы можете получать доступ и оперировать нужными элементами в массиве указывая имя массива и номер элемента в нем (называемый также индексом). Индекс элемента в массиве - это уникальный номер, определяющий положение элемента в массиве. Индекс (оба индекса в случае двумерного массива) первого элемента в массиве равен 1.

Если массив одномерный, используется один индекс для указания номера строки, содержащей нужный элемент (значение индекса совпадает с номером строки - прим.переводчика). Например, индекс элемента, находящегося в третьей строке одномерного массива, равен 3.

Если массив двумерный, для указания элемента в нем используются два индекса. Первый индекс указывает номер строки, а второй - номер столбца. Например, индексы элемента, находящегося в третьей строке и четвертом столбце двумерного массива определяются как (3,4). Вы можете также ссылаться на элементы двумерного массива используя один индекс.

Чтобы получить один индекс вместо пары индексов, определяющих строку и столбец, используйте функцию AELEMENT( ). Чтобы преобразовать один индекс к паре индексов (строка,столбец), используйте функцию ASUBSCRIPT( ).

Прим.переводчика. Элементы массива в Visual FoxPro хранятся по строкам. Это означает, что сначала размещаются элементы первой строки, затем второй и так далее. Это позволяет однозначно определить порядковый номер элемента в двумерном массиве. Если массив содержит m строк и n столбцов, то номер элемента, находящегося в строке i и столбце j определяется как i x(n-1) + j. По этой формуле производит вычисление индекса и функция AELEMENT( ).

Для получения дальнейшей информации об индексах смотрите Функция ASUBSCRIPT( ).

Переопределение размеров массивов Вы можете изменить размер и размерность массива повторно используя DIMENSION. Размер массива можно увеличивать и уменьшать; одномерный массив можно преобразовать в двумерный и наоборот.

Замечание:
Если переопределить двумерный массив, уменьшив число строк и/или столбцов в нем, количество элементов в нем уменьшится в соответствии с порядковыми номерами элементов, а не их индексами. Например, если массив размером 10х10 переопределить как 10х7, будут утеряны элементы с порядковыми номерами от 71 и выше. За дальнейшими разъяснениями обратитесь к Функция AELEMENT( ).

Прим.переводчика. Как уже отмечалось выше, элементы массива хранятся по строкам. В приведенном примере уменьшается количество столбцов с 10 до 7, однако реально теряются не элементы не в столбцах, а в строках, поскольку общее количество элементов уменьшается путем их отбрасывания от конца массива. Это нужно иметь в виду, если планируется использовать значения, находившиеся в элементах массива до изменения его размеров. В случае, когда уменьшается количество строк, на самом деле теряются именно строки.

Для демонстрации этого эффекта попробуйте выполнить следующие строки кода:

DIMENSION a[10,10]
a[10,1]=1
DIMENSION a[10,7]
?a[10,1]    && отображается .F.

Если количество элементов в массиве увеличивается, содержимое всех элементов исходного массива копируется во вновь создаваемый массив с указанными размерами. Добавочные элементы инициализируются значением Ложно (.F.).

Прим.переводчика. И в этом случае вас может подстерегать "сюрприз". Если увеличить число столбцов в двумерном массиве, то необходимое количество элементов будет добавлено в конец массива. При этом не добавочные столбцы будут заполнены значениями .F., а добавленные элементы, что может сделать использование старых значений элементов бессмысленным.

Ниже приведен пример, когда массив размером 2х3 переопределяется в массив размером 2х4. Предполагается, что элементы массива были инициализированы символьными значениями, содержащими индекс строки и столбца, т.е. в элемент a[1,1] содержал значение "1,1", a[1,2] - значение "1,2" и так далее.

Исходный массив (2,3)

1,1 1,2 1,3
2,1 2,2 2,3

После переопределения массива (2,4)

1,1 1,2 1,3 2,1
2,2 2,3 .F. .F.

Если размер массива увеличивается или уменьшается при действующей установке SET COMPATIBLE ON или DB4, значение каждого элемента массива будет инициализировано логическим .F.

Типизированные массивы Вы можете передавать типизированные массивы по ссылке (by reference) или по значению (by value). Вам не следует объявлять объекты Visual FoxPro с типом, таким как CommandButton. Вместо этого используйте тип Object:

  Скопировать код
DIMENSION aObjects[] AS CommandButton && Не поддерживается
DIMENSION aObjects[] AS Object && Рекомендуется
Замечание:
В COM-серверах, которые являются серверами Visual FoxPro server, вы можете указывать объекты с типами, допустимыми в Visual FoxPro. В тоже время другие сервера не распознают такие типы.

Вам следует использовать функцию COMARRAY( ) для управления установками, которые передаются COM-серверам, например, zero-based, byref и т.д.

Замечание:
Когда массивы передаются серверам, работающим в Microsoft .NET Framework, вы должны объявлять COMARRAY(<object>, 10) для передачи массива, индексы которого начинаются с 0 (zero-based array) по ссылке. Код, обеспечивающий работу .NET Framework, предполагает получение массива по ссылке, поэтому получив его по значению, он не будет корректно работать.

Типизированные массивы Single (scaler) не поддерживаются никакими другими COM-серверами, кроме COM-серверов Visual FoxPro. Вы не можете передавать тип Currency серверам, работающим в Microsoft .NET Framework.

Когда сервера работают в Microsoft .NET Framework, возвращаются типы System.Decimal и System.UInt16, которые преобразуются в wchart_t, принимаемым Visual FoxPro как тип Decimal.

Примеры

Пример 1

Следующий пример показывает результат увеличения размера одномерного массива.

Замечание:
Если вы введете эти команды в окне команд (Command window), массив будет объявлен как 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 для обмена данными между записями таблицы и массивами.

  Скопировать код
DIMENSION marrayone(4)
STORE 'E' TO marrayone(1)
STORE 'F' TO marrayone(2)
STORE 'G' TO marrayone(3)
STORE 'H' TO marrayone(4)
CLEAR
DISPLAY MEMORY LIKE marrayone
DIMENSION marrayone(2,3)
DISPLAY MEMORY LIKE marrayone
WAIT WINDOW

Пример 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

В следующем примере массив создается в Visual FoxPro и передается COM-серверу Visual Basic, который ожидает получения строго типа Long. Вызов FillIntArray должен был завершиться неудачно, поскольку массив aMyArray имеет тип Variant. Тем не менее, после включения описания в классе Visual Basic массива с типом Variant, названного FillIntArray, все нормально работает:

  Скопировать код
* Код Visual FoxPro
DIMENSION aMyArray [100] AS Long
lo.FillIntArray(@aMyArray, 100) && Передача Visual Basic COM-серверу

' Добавьте следующий код 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

Смотрите также