Создает одномерный или двумерный массив переменных.
Замечание: |
|---|
| DIMENSION идентична по действию и схожа по синтаксису с командой DECLARE. Для получения дальнейших сведений смотрите Команда DECLARE. |
DIMENSION ArrayName1(nRows1 [, nColumns1]) [AS cType] |
Параметры
- ArrayName1
- Указывает имя массива.
Подсказка: Вы можете создавать множество массивов посредством одной команды DIMENSION, указывая нужные имена массивов, например, ArrayName2, ArrayName3 и так далее.
- nRows1 [, nColumns1]
- Указывает размер создаваемого массива.
Для того, чтобы создать одномерный массив, задайте только nRows1. В этом случае команда DIMENSION использует nRows1 для создания соответствующего числа строк в одномерном массиве, т.е. в массиве, имеющем только одну колонку. Например, следующая команда создает одномерный массив с именем
Подсказка: Вы должны указывать размер каждого массива, который вы создаете командой DIMENSION. Размер массива может быть ограничен доступной памятью, что влияет на производительность, особенно для больших массивов. Будьте уверены, что ваш компьютер имеет достаточно памяти для размещения всего массива. gaArrayOne, содержащий десять строк и одну колонку:Для создания двумерного массива задайте nRows1 и nColumns1. В этом случае nRows1 указывает количество строк в массиве, а nColumns1 - количество колонок. В следующем примере создается двумерный массив с именем
Скопировать кодDIMENSION gaArrayOne(10)
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) | |
Элементы массива Размер массива определяется количеством содержащихся в нем элементов. В каждый элемент массива можно поместить одну частицу информации. Для определения общего количества элементов в массиве умножьте количество строк (nRows1) в массиве на количество столбцов (nColumns1) в нем.
Элементы массива могут содержать данные любого типа и первоначально (при создании массива) они инициализируются значением Ложно (.F.). Вы можете инициализировать элементы массива одинаковым значением при помощи команды STORE, если действует установка SET FOXPLUS OFF (по умолчанию). В следующем примере строка "initial" инициализирует массив gaArray:
Скопировать код | |
|---|---|
DIMENSION gaArray(10,3) | |
Для получения сведений об ограничениях на количество элементов в массиве смотрите Системные ограничения 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] |
Если количество элементов в массиве увеличивается, содержимое всех элементов исходного массива копируется во вновь создаваемый массив с указанными размерами. Добавочные элементы инициализируются значением Ложно (.F.).
|
Прим.переводчика. И в этом случае вас может подстерегать "сюрприз". Если увеличить число столбцов в двумерном массиве, то необходимое количество элементов будет добавлено в конец массива. При этом не добавочные столбцы будут заполнены значениями .F., а добавленные элементы, что может сделать использование старых значений элементов бессмысленным. Ниже приведен пример, когда массив размером 2х3 переопределяется в массив размером 2х4. Предполагается, что элементы массива были инициализированы символьными значениями, содержащими индекс строки и столбца, т.е. в элемент a[1,1] содержал значение "1,1", a[1,2] - значение "1,2" и так далее. Исходный массив (2,3)
После переопределения массива (2,4)
|
Если размер массива увеличивается или уменьшается при действующей установке SET COMPATIBLE ON или DB4, значение каждого элемента массива будет инициализировано логическим .F.
Типизированные массивы Вы можете передавать типизированные массивы по ссылке (by reference) или по значению (by value). Вам не следует объявлять объекты Visual FoxPro с типом, таким как CommandButton. Вместо этого используйте тип Object:
Скопировать код | |
|---|---|
DIMENSION aObjects[] AS CommandButton && Не поддерживается | |
Замечание: |
|---|
| В 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) | |
Пример 2
В следующем примере одномерный массив преобразуется к двумерному. Содержимое элементов исходного массива копируется в результирующий сначала заполняя его первую строку, затем вторую и т.д. Дополнительные элементы (если они есть) инициализируются значением Ложно (.F.).
Когда двумерный массив преобразуется к одномерному, содержимое исходного массива построчно копируется в результирующий. Первый элемент в первой строке становится первым элементом одномерного массива, второй элемент в первой строке - вторым элементом одномерного массива и т.д.
Используйте функции ADEL( ) или AINS( ) для удаления или вставки элементов массива, строк и столбцов. Используйте команды APPEND FROM ARRAY, COPY TO ARRAY, SCATTER и GATHER для обмена данными между записями таблицы и массивами.
Скопировать код | |
|---|---|
DIMENSION marrayone(4) | |
Пример 3
В следующем примере двумерный массив создается и заполняется данными. Затем отображаются элементы массива и содержащиеся в них данные.
Скопировать код | |
|---|---|
DIMENSION sample(2,3) | |
Пример 4
В следующем примере массив создается в Visual FoxPro и передается COM-серверу Visual Basic, который ожидает получения строго типа Long. Вызов FillIntArray должен был завершиться неудачно, поскольку массив aMyArray имеет тип Variant. Тем не менее, после включения описания в классе Visual Basic массива с типом Variant, названного FillIntArray, все нормально работает:
Скопировать код | |
|---|---|
* Код Visual FoxPro | |
Смотрите также
Функция AELEMENT( )
Функция AINS( )
Функция ALEN( )
Функция ASUBSCRIPT( )
Команда DECLARE
Команда EXTERNAL
Команда PRIVATE
Команда PUBLIC
Команда SET COMPATIBLE




