Файл: Особенности и примеры использования массивов при разработке программ (Особенности использования массивов).pdf
Добавлен: 16.05.2023
Просмотров: 105
Скачиваний: 2
В общем случае массив может содержать данные разных типов. Присвоить всем элементам массива одно и то же значение позволяют, если SET COMPATIBLE установлен в OFF, команда STORE или =.
Элементы двумерного массива располагаются в памяти построчно. Номер строки (столбца) элемента массива по его номеру возвращает функция ASUBSCRIPT( ). Номер элемента массива по его индексам возвращает функция AELEMENT( ).
Функции ADEL( ) и AINS( ) соответственно удаляют и вставляют элементы строки или столбцы массива. Команды APPEND FROM ARRAY, COPY TO ARRAY, SCATTER и GATHER осуществляют обмен данными между массивом и записями таблицы.
По ходу выполнения программы форма массива может быть изменена (путем повторного употребления команды DIMENSION): двумерный массив может быть объявлен как одномерный, и наоборот. Могут быть произвольным образом изменены протяженности по каждому из измерений.
Если двумерный массив объявляется повторно с меньшим числом строк или столбцов, то уменьшение массива производится не по строкам или столбцам, а отбрасываются элементы с номерами, большими нового размера массива. Так, если массив формы 10×10 объявляется как массив формы 10×7, то теряются элементы с номерами 71, 72, …, 100.
При увеличении размера массива новые элементы получают значение .F. Если SET COMPATIBLE установлен в OFF, то значения прежних элементов сохраняются, а если – в ON или DB4, заменяются на .F.
Типизированный массив может быть передан COM-объекту как по ссылке, так и по значению. Объявляя формальный параметр-массив, не следует явно указывать тип объекта, например CommandButton, взамен нужно употреблять Object:
procedure someProc
lparameters aObjects[ ]
dimension aObjects[ ] as CommandButton && Не поддерживается
…
endProc
procedure someProc
lparameters aObjects[ ]
dimension aObjects[ ] as Object && Рекомендуется
…
endProc
Для определения способа передачи массива COM-объекту употребляется функция COMARRAY( ).
Пример. Массив aMyArray создается в VFP, а затем передается Visual Basic COM-серверу, ожидающему тип данных Long.
&& Код VFP
dimension aMyArray [10] as Long
&& Передаем массив Visual Basic COM-серверу
lo.FillIntArray(@aMyArray, 100)
' Этот код нужно добавить в Visual Basic CLS-file
' и откомпилировать как COM-компонент
Public Sub FillIntArray(ByRef aInts( ) as Long, iCount as Long)
ReDim aInts(1 to 100)
Dim ii as Integer
For ii = 1 to 100
aInts(ii) = ii
Next
End Sub
Команда DECLARE ArrayName1(nRows1 [, nColumns1]) [AS cType]
[, ArrayName2(nRows2 [, nColumns2])] ...
полностью аналогична команде DIMENSION.
2. Функции для работы с массивами и примеры их использования
Все рассматриваемые ниже функции имеют параметр ArrayName – имя формируемого или преобразовываемого, или анализируемого функцией массива.
Для функций, извлекающих информацию в массив, справедливо следующее: если массив ArrayName не существует, то он будет создан, если существует, то приобретет форму, необходимую для хранения результата. Если функция не находит необходимых для заполнения массива данных, то несуществующий массив, создан не будет, а существующий останется без изменений.
При вызове функций, преобразовывающих массив или получающих о нем данные, массив ArrayName должен существовать.
Функция ACLASS(ArrayName, oExpression) заносит в одномерный массив ArrayName имя класса объекта oExpression и имена классов-потомков. Функция возвращает число занесенных в массив элементов.
Пример. Создается класс VectorInit, содержащий метод InitArray, выполняющий инициализацию вектора. На его основе создается класс VectorFunction, содержащий метод DotProduct, возвращающий скалярное произведение двух векторов одной длины. Длина векторов задается свойством arraySize класса VectorInit.
&& Создаем объект типа VectorFunction
vFunc = CreateObject("VectorFunction")
&& Формируем и печатаем массив arrayClassNames
nCount = Aclass(arrayClassNames, vFunc)
for k = 1 to nCount
? arrayClassNames(k)
endFor
&&
&& Напечатает:
&& VectorFunction
&& VectorInit
&& Custom
&&
&& Создаем одномерные массивы arrayA и arrayB
&& Размер массивов
vFunc.ArraySize = 10
dimension arrayA(vFunc.ArraySize), arrayB(vFunc.ArraySize)
&& Выполняем их инициализацию массивов
&& Передаем имена массивов по ссылке
vFunc.InitArray(@arrayA)
vFunc.InitArray(@arrayB)
&& Вычисляем скалярное произведение векторов arrayA и arrayB
&& Массивы должны быть переданы по ссылке
? vFunc.DotProduct(@arrayA, @arrayB)
&&
&& Возможный результат: 2.5671
&& Освобождаем объект vFunc
release vFunc
&& Создаем класс VectorInit
define class VectorInit as Custom
&& ArraySize – свойство класса VectorInit
&& используется для задания размера инициализируемого вектора
ArraySize = 1
&& Инициализация вектора vect размера This.ArraySize случайными числами
procedure InitArray(vect)
for k = 1 to This.ArraySize
vect(k) = Rand( )
endFor
endProc
endDefine
&& Создаем класс VectorFunction; VectorInit – имя класса-родителя
define class VectorFunction as VectorInit
&& Вычисляет скалярное произведение векторов равной длины
function DotProduct(a, b)
dp = 0
for k = 1 to This.ArraySize
dp = dp + a(k) * b(k)
endFor
return dp
endFunc
endDefine
Функция ACOPY(SourceArrayName,DestinationArrayName [,nFirstSourceElement [, nNumberElements [, nFirstDestElement]]]) копирует элементы одного массива в другой. При копировании данные приемника заменяются данными источника. Если массив-приемник не существует, то он будет создан. Форма созданного массива будет совпадать с формой массива-источника. Если массив приемник существует, то он при копировании примет форму массива-источника.
Параметры:
SourceArrayName, DestinationArrayName – соответственно имена массивов источника и приемника данных.
nFirstSourceElement – номер элемента массива-источника, с которого начинается копирование. При отсутствии параметра копирование начинается с первого элемента.
nNumberElements – число копируемых элементов. Если параметр отсутствует или равен 1, то копируются все элементы начиная с nFirstSourceElement.
nFirstDestElement – первый замещаемый элемент массива-приемника.
Функция ACOPY( ) возвращает число скопированных элементов.
Пример. Копируются начиная со второго 3 элемента массива sArray в массив dArray, в котором первым замещается 3-й элемент.
dimension sArray(2, 3), dArray(2, 3)
store "s" to sArray
store "d" to dArray
Acopy(sArray, dArray, 2, 3, 3)
&& Массив dArray: |
d |
d |
s |
&& |
s |
s |
d |
Функция ADATABASES(ArrayName) заносит имена всех открытых баз данных и пути к файлам баз данных в двумерный массив ArrayName. Первый элемент каждой строки массива содержит имя базы данных, второй – путь к базе данных. Возвращает число строк в результирующем массиве.
Пример:
close databases
open database 'd:\HomeLibrary\HomeLibrary'
Adatabases(arrayDBC)
? arrayDBC(1, 1)
? arrayDBC(1, 2)
close databases
Результат:
HOMELIBRARY
D:\HOMELIBRARY\HOMELIBRARY.DBC
Функция ADBOBJECTS(ArrayName, cSetting) записывает имена соединений, отношений, таблиц и SQL-видов текущей базы данных в массив ArrayName. Если параметр cSetting имеет значение CONNECTION, TABLE или VIEW, то формируется одномерный массив, если RELATION – двумерный. Каждая строка одномерного массива содержит имя соединения, таблицы или SQL-вида, в каждой строке двумерного массива ее 1-й элемент содержит имя дочерней таблицы, 2-й – имя родительской таблицы, 3-й – имя индекса дочерней, а 4-й – имя индекса родительской таблицы. В 5-й элемент записывается информация о ссылочной целостности данных.
Если межтабличная связь не имеет пользовательских правил контроля ссылочной целостности, то элемент содержит 3 символа, соответствующие типу задаваемых в Referential Integrity Builder (см. рис. 2.11) правил контроля ссылочной целостности для обновления, удаления и вставки записей. При этом 1-й символ означает тип правила обновления, 2-й – удаления, а 3-й – вставки. Возможные значения для правил обновления и удаления следующие: "C" – каскадирование, "R" – запрет и "I" – игнорирование. Для правила вставки употребляются только "R" и "I". Так, если для связи заданы следующие правила контроля ссылочной целостности: при обновлении – каскадирование; при удалении – запрет, а при вставке – игнорирование, то 5-й элемент строки массива будет равен "CRI".
В момент исполнения ADBOBJECTS( ) база данных должна быть открыта, в противном случае будет сгенерировано сообщение об ошибке.
Пример:
close databases
open database 'd:\HomeLibrary\HomeLibrary'
declare arrayOfSettings(4)
arrayOfSettings(1) = "CONNECTION"
arrayOfSettings(2) = "TABLE"
arrayOfSettings(3) = "VIEW"
arrayOfSettings(4) = "RELATION"
for k = 1 to 4
if ADBObjects(arrayDBO, arrayOfSettings(k)) > 0 then
&& Печатаем значение cSetting
? arrayOfSettings(k)
display memory like arrayDBO
endif
endFor
close databases
Результат:
ARRAYDBO Priv A test( 1 ) C "AUTHORS"
( 2 ) C "BOOKS"
( 3 ) C "BOOKSCONTENT"
( 4 ) C "BOOKSAUTHORS"
( 5 ) C "WORKTYPE"
RELATION
ARRAYDBO Priv A test
( 1, 1) C "BOOKSAUTHORS"
( 1, 2) C "BOOKS"
( 1, 3) C "BOOKID"
( 1, 4) C "BOOKID"
( 1, 5) C "CRI "
…
Функция ADEL(ArrayName, nElementNumber [, 2]) удаляет элемент одномерного или строку или столбец двумерного массива ArrayName.
Удаление элементов не приводит к изменению формы массива. При удалении элемента или строки последние элементы соответствующим образом смещаются по направлению к началу массива. На их месте возникают элементы равные .F. При удалении столбца сдвигаются столбцы по направлению к первому столбцу; элементы последнего столбца оказываются равными .F.
Параметр:
nElementNumber – номер удаляемого элемента, если массив одномерный. Если массив двумерный, то параметр при отсутствии последнего параметра задает номер удаляемой строки, а при наличии последнего параметра – номер удаляемого столбца.
При успешном удалении функция вернет 1, при неудаче – 0.
Пример. Удаляется элемент одномерного массива: строка, а затем столбец двумерного массива.
dimension oneDArray(7), twoDArray(2, 3)
&& Инициализация массивов
store 4 to oneDArray, twoDArray
for iCol = 1 to 3
&& Изменяем 2-ю строку массива twoDArray
twoDArray(2, iCol) = 5
endFor
Adel(oneDArray, 2) && Результат: 4 4 4 4 4 4 .F.
&& Удаляем 1-ю строку
Adel(twoDArray, 1)
&& Массив twoDArray: |
5 |
5 |
5 |
&& |
.F. |
.F. |
.F. |
&& Повторная инициализация массива twoDArray
store 7 to twoDArray
&& Удаляем 2-й столбец
Adel(twoDArray, 2, 2)
&& Массив twoDArray: |
7 |
7 |
.F. |
&& |
7 |
7 |
.F. |
Функция ADIR(ArrayName [, cFileSkeleton [, cAttribute [, nFlag]]])
помещает информацию о файлах в массив ArrayName и возвращает число файлов, описанных в массиве.
Результирующий массив имеет 5 столбцов; число строк массива равно числу описанных в нем файлов.
Функция ADLLS(ArrayName) формирует двумерный массив ArrayName, содержащий имена функций, загруженных командой DECLARE – DLL. В каждой строке массива ее первый элемент содержит имя функции, второй – псевдоним функции, третий – имя библиотеки. Тип данных – Character. Функция возвращает число строк результирующего массива.
Функция ADOCKSTATE(ArrayName [, nType | nExtended]) заносит в массив ArrayName вариант прикрепления всех прикрепляемых IDE-окон и панелей инструментов, как системных, так и пользовательских (IDE – integrated development environment). Функция возвращает число строк в результирующем массиве.
Функция AELEMENT(ArrayName, nRowSubscript [, nColumnSubscript]) возвращает номер элемента массива ArrayName по значениям индексов элемента. Если значения индексов превышают протяженности по соответствующим измерениям, то возникнет ошибка исполнения. Номер элемента может быть использован для обращения к двумерному массиву по номеру (то есть как к одномерному), а не по индексам. Индексы элемента по его номеру определяются функцией ASUBSCRIPT( ).
Параметры:
nRowSubscript – в случае двумерного массива номер строки, в которой расположен элемент; в случае одномерного массива – номер элемента, то есть результат функции.
nColumnSubscript – номер столбца, в котором расположен элемент.
Пример:
dimension twoDArray(3, 4)
? Aelement(twoDArray, 2, 3) && Напечатает: 7
? Asubscript(twoDArray, 7, 1) && Напечатает: 2
? Asubscript(twoDArray, 7, 2) && Напечатает: 3
Функция AERROR(ArrayName) создает массив ArrayName, содержащий сведения о последней ошибке VFP, OLE или ODBC. Массив имеет 7 столбцов. Функция возвращает число строк в созданном массиве. Это число зависит от вида возникшей ошибки.
При возникновении ошибки VFP, OLE или ODBC в столбцах 1 – 7 каждой строки массива находятся приведенные в табл. 2 данные.
Таблица 2
Значения элементов массива ArrayName, созданного AERROR( )
Элемент |
Что содержит |
Ошибка VFP |
|
1 |
Номер ошибки, такой же, что и возвращаемый функцией ERROR( ) |
2 |
Текст сообщения об ошибке, такой же, что и возвращаемый функцией MESSAGE( ) |
3 |
NULL или параметр ошибки, такой же, что и возвращаемый функцией SYS(2018) |
4 |
NULL или номер рабочей области, в которой ошибка произошла |
5 |
NULL или, если триггер отказал (ошибка 1539), одно из следующих значений: |
6, 7 |
NULL |
Ошибка OLE (номера ошибок в VFP 1427 или 1429) |
|
1 |
Номер ошибки (число 1427 или 1429) |
2 |
Текст VFP-сообщения об ошибке |
3 |
Текст OLE-сообщения об ошибке |
4 |
Имя приложения, например Microsoft Excel |
5 |
NULL или имя Help-файла приложения, содержащего сведения об ошибке |
6 |
NULL или ID (тип – Character) соответствующей темы в Help-файле |
7 |
Номер исключения OLE; тип – Numeric |
Ошибка ODBC (номер ошибки в VFP 1526) |
|
1 |
Номер ошибки (число 1526) |
2 |
Текст VFP-сообщения об ошибке |
3 |
Текст ODBC-сообщения об ошибке |
4 |
Текущее ODBC SQL-состояние; тип – Character |
5 |
Номер ошибки ODBC-источника данных |
6 |
Номер идентификатора соединения ODBC |
7 |
NULL |