![](/stc/img/evkova.png)
Особенности и примеры использования массивов при разработке программ
Содержание:
Введение
Занимаясь программированием, мы достаточно часто сталкиваемся с использованием массивов. У многих эта тема вызывает достаточно много трудностей из-за непонимания того: что из себя представляют массивы и как с ними работать. Однако их использование было, есть и будет одной из наиболее важный частей написания программного кода. Именно поэтому была выбрана эта тема.
Как было сказано выше, массивы очень распространенная вещь. По определению, массив – это нумерованный набор переменных. Переменные в массиве – это элементы массива. Их позиция в массиве задается индексом.
Если понять это не очень просто, то представьте себе «волшебную» коробку. В ней Вы можете создавать сколько угодно отделов и складывать что-то в эти отделы. При необходимости, Вы можете: удалять отделы; создавать новые; вытаскивать и использовать содержимое, которое в них находится; заменять содержимое отдельных отсеков чем-то другим; Вы можете даже хранить в одном из отсеков другой массив, который также содержит разные отделы.
Цель работы – рассмотреть особенности и примеры использования массивов при разработке программ.
Так как массивы по-разному описываются в разных языках программирования, используются разные функции при работе с ними, то примеры использования будут рассмотрены на одном языке программирования – Visual FoxPro.
Особенности использования массивов
Понятие и назначение массивов
С понятием «массив» приходится сталкиваться при решении научно-технических и экономических задач обработки совокупностей большого количества значений. В общем случае массив – это структурированный тип данных, состоящий из фиксированного числа элементов, имеющих один и тот же тип.
Массив – это составной объект, образованный из элементов (компонент) одного и того же типа. Такой тип данных применяется в программировании для обозначения объектов, аналогичных числовым последовательностям в математике, где сразу целая группа чисел обозначается одним именем (чаще всего буквой), а для обращения к каждому отдельному числу данной последовательности используются различные индексы (номера элементов). В математике это может выглядеть, например, так:
a1, а2, а3, …, аn.
Таким образом, в программировании массив – это последовательность однотипных элементов, имеющих общее имя, причем каждый элемент этой последовательности определяется порядковым номером (индексом) элемента.
Примеры массивов:
- Х1, Х2, …, Хn – одномерный массив, состоящий из n элементов;
- А0, А1, А2, …, А10 – одномерный массив, состоящий из 11 элементов.
Массивы бывают одномерными (один индекс), двумерными (два индекса) и т.д.
Структура массива всегда однородна. Массив может состоять из элементов типа integer , real или char , либо других однотипных элементов. Другая особенность массива состоит в том, что к любой его компоненте можно обращаться произвольным образом. Программа может сразу получить нужный ей элемент по его порядковому номеру (индексу). Номер элемента массива называется индексом. Индекс – это значение порядкового типа, определенного, как тип индекса данного массива. Тип индекса определяет границы изменения значений индекса.
Рассмотрим массив Х1, Х2, …, Хn. Здесь
- Х – имя массива;
- 1, 2,…, n – индексы (порядковые номера) элементов;
- Х7 – седьмой элемент массива Х.
Описание массивов на примере языка FoxPro
При выполнении вычислений в некоторых случаях удобно обрабатывать данные, предварительно записав их в один или несколько массивов.
Массив – это объект языка, содержащий несколько элементов, доступ к элементу осуществляется по имени массива и индексам элемента, например:
declare twoDArray(3, 4)
&& Печатаем элемент twoDArray(2, 3) двумерного массива формы 3×4,
&& Элемент расположен во второй строке массива и его третьем столбце,
&& то есть имеет индексы равные 2 и 3
? twoDArray(2, 3)
В VFP можно работать как с одномерными массивами (векторами), так и с двумерными (матрицами).
Перед употреблением массив надо создать. Массив, как и скалярные переменные, создается командами LOCAL, PUBLIC, а также командами DECLARE и DIMENSION, например:
&& Создаем одномерный и двумерный массивы
&& Двумерный массив twoDArray имеет 3 строки и 4 столбца
dimension oneDArray(7), twoDArray(3, 4)
или
local oneDArray(7), twoDArray(3, 4)
Можно одновременно употребить LOCAL (PRIVATE, PUBLIC) и DIMENSION (DECLARE):
local oneDArray, twoDArray
dimension oneDArray(7), twoDArray(3, 4)
Массивы, объявленные командой DIMENSION (DECLARE) без использования команд LOCAL и PUBLIC, воспринимаются VFP как PRIVATE-переменные.
При работе с массивами взамен круглых скобок можно использовать квадратные, например:
dimension oneDArray[7], twoDArray[3, 4]
oneDArray[2] = 9
twoDArray[2, 3] = 9
Массив характеризуется формой. Так, oneDArray является массивом формы 7, а twoDArray – это массив формы 3×4. Каждое измерение массива характеризуется протяженностью. Так, массив формы 3×4 по первому измерению имеет протяженность равную 3, а по второму – 4.
Одномерный массив oneDArray имеет 7 элементов с именами
oneDArray(1), oneDArray(2), …, oneDArray(7).
Двумерный массив twoDArray имеет 12 элементов с именами
twoDArray(1, 1), …, twoDArray(1, 4)
twoDArray(2, 1), …, twoDArray(2, 4)
twoDArray(3, 1), …, twoDArray(3, 4).
Создать массив, как и иную переменную, можно в любом месте программного компонента. Кроме того, в команде, создающей массив, для указания формы массива можно использовать не только константу, но и переменную, например:
store 3 to numberOfRows
numberOfCols = 2 * numberOfRows
declare someArray(numberOfRows, numberOfCols)
Если при задании формы массива использовано нецелое число, то при исполнении берется его целая часть, например:
declare someArray(3.2, 4.8) && Массив формы 3×4
store 9 to someArray(2, 3)
? someArray(2.25, 3.8) && Напечатает: 9
После создания все элементы массива равны .F. Всем элементам массива можно, если SET COMPATIBLE установлен в OFF (что задано по умолчанию), присвоить одно значение, выполнив команду STORE или употребив оператор присваивания, например:
dimension oneDArray(7), twoDArray(3, 4)
if set("COMPATIBLE") = "ON" then
set compatible off
endif
store 1 to oneDArray
twoDArray = 2
Эти же средства пригодны и для изменения значения одного элемента массива:
store 9 to twoDArray(2, 3)
oneDArray(4) = 9
К двумерному массиву можно обратиться так же, как и к одномерному, а к одномерному, – как к двумерному, например:
store 9 to oneDArray(4), twoDArray(2, 3)
? twoDArray(2, 3) && Напечатает: 9
&& Обращаемся к тому же элементу массива, используя номер элемента
? twoDArray(7) && Напечатает: 9
? oneDArray(1, 4) && Напечатает: 9
Элементы двумерного массива нумеруются построчно. Поэтому нетрудно подсчитать, что порядковый номер элемента twoDArray(2, 3) массива формы 3×4 равен 7. Можно не обременять себя расчетами, а применить функцию AELEMENT( ), возвращающую номер элемента массива по его индексам.
Форму массива можно изменить по ходу выполнения программы. Если число элементов массива уменьшается, то отбрасываются его последние элементы. Так, в случае двумерного массива twoDArray при изменении его формы с 3×4 на 2×3 будут отброшены элементы twoDArray(2, 3), twoDArray(2, 4), twoDArray(3, 1), …, twoDArray(3, 4). В этом легко убедиться, выполнив следующий код:
dimension twoDArray(3, 4) && Все элементы массива равны .F.
store 2 to twoDArray && Все элементы массива равны 2
&& Меняем значения элементов начиная с элемента twoDArray(2, 3) с 2-х на 5
twoDArray(2, 3) = 5
twoDArray(2, 4) = 5
for iCol = 1 to 4
twoDArray(3, iCol) = 5
endFor
&& Уменьшаем размер массива с 3×4 до 2×3
dimension twoDArray(2, 3)
&& Печатаем значения всех его элементов
for iRow = 1 to 2
for iCol = 1 to 3
&& Все значения печатаем на одной строке
?? twoDArray(iRow, iCol) && Напечатает: 2 2 2 2 2 2
endFor
endFor
При увеличении числа элементов массива добавленные элементы получат значение .F.
В VFP элементы одного и то же массива могут иметь разный тип, например:
oneDArray(4) = 9
oneDArray(5) = "5-й элемент"
Пример 1. Присвоить каждому элементу массива twoDArray значение, равное номеру строки для этого элемента.
dimension twoDArray(3, 4)
for iRow = 1 to 3
for iCol = 1 to 4
twoDArray(iRow, iCol) = iRow
endFor
endFor
Пример 2. Выводится элемент массива oneDArray, если в массиве twoDArray есть элемент с таким же значением и если его значение не равно .F.
dimension oneDArray(7), twoDArray(3, 4)
store 9 to oneDArray(4), twoDArray(2, 3)
for iRow = 1 to 3
for iCol = 1 to 4
someElement = twoDArray(iRow, iCol)
for k = 1 to 7
&& Нельзя сравнивать значения разных типов
if VarType(oneDArray(k)) = VarType(someElement) then
if VarType(someElement) = 'L' and not someElement then
&& Элементы со значение .F. выводиться не должны
loop
else
if oneDArray(k) = someElement then
&& Печатаем элемент, удовлетворяющий заданным условиям
? someElement
endif
endif
endif
endFor
endFor
endFor
Если быть уверенным, что элементы рассматриваемых массивов имеют один отличный от Logical тип (скажем, Character), то код станет существенно короче:
for iRow = 1 to 3
for iCol = 1 to 4
someElement = twoDArray(iRow, iCol)
for k = 1 to 7
if oneDArray(k) = someElement then
? someElement
endif
endFor
endFor
endFor
Поскольку в общем случае это не так, то перед выполнением команды
if oneDArray(k) = someElement then
нужно убедиться, что сравниваемые значения имеют один тип.
Использование массивов при разработке программ
Команда DIMENSION ArrayName1(nRows1 [, nColumns1]) [AS cType]
[, ArrayName2(nRows2 [, nColumns2])] ...
создает один или несколько одномерных или двумерных массивов. При создании все элементы массива получают значение .F.
Параметры и опция:
ArrayName1, ArrayName2 ... – имена создаваемых массивов.
nRows1 [, nColumns1] – протяженности массива ArrayName1 по первому и второму измерениям (число строк и столбцов массива). Если указывается только nRows1, то создается одномерный массив, если добавляется и nColumns1, то – двумерный.
AS cType – тип массива. Задается, когда нужно указать тип, отличный от Variant. Опция употребляется при передачи массива COM-компоненту. Если тип указан неверно, то VFP устанавливает для массива тип Variant. Данные типа Variant могут передаваться только по ссылке.
Возможные значения параметра c Type и варианты преобразования типа cType приведены в табл. 1.
Таблица 1
Значения cType и варианты преобразования типа, заданного cType
cType |
IntelliSense-информация |
COM-имя |
COM Typelib-имя |
.NET system |
XSD (SOAP) |
Array |
Array |
– |
SAFEARRAY(type) |
Type[ ] |
Base64Binary |
BinaryMemo |
– |
Variant |
VARIANT (VT_VARIANT) |
System.Object |
anyType |
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 |
– |
В общем случае массив может содержать данные разных типов. Присвоить всем элементам массива одно и то же значение позволяют, если 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.
Функции для работы с массивами и примеры их использования
Все рассматриваемые ниже функции имеют параметр 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 |
Функция AEVENTS(ArrayName [, 0 | 1 | oEventObject]) формирует массив ArrayName, содержащий описание события и связанного с ним метода. Возвращает число связываний событий (связывание события объекта – это задание метода некоторого класса в качестве обработчика события).
Параметры:
0 – функция AEVENTS( ) возвращает одномерный массив из 3-х элементов, содержащий приведенные в табл. 3 значения.
Таблица 3
Элементы массива ArrayName, когда второй параметр равен 0
Элемент |
Что содержит |
Тип |
1 |
Объект-источник события |
Object |
2 |
Событие |
Character |
3 |
Тип события или как событие вызвано: |
Integer |
Если событие является свойством, значение третьего элемента равно 1 или 2. Причем оно равно 2, если значение свойства устанавливается.
1 – функция AEVENTS( ) возвращает двумерный массив с 4-я столбцами, содержащий информацию о сообщении Windows. Массив содержит одну строку для каждого связывания. Элементы строки массива описаны в табл.4.
Таблица 4
Элементы массива ArrayName, когда второй параметр равен 1
Элемент |
Что содержит |
Тип |
1 |
hWnd |
Integer |
2 |
Сообщение Windows |
Integer |
3 |
Ссылка или идентификатор |
Ссылка на объект |
4 |
Имя связанного метода |
Character |
oEventObject – ссылка на объект, содержащий метод, установленный в качестве обработчика события (привязанный к событию). При задании параметра AEVENTS( ) возвращает двумерный массив с 5-ю столбцами, содержащими приведенный в табл. 5 сведения.
Таблица 5
Содержимое строки массива ArrayName, когда задан параметр oEventObject
Номер |
Что содержит |
Тип |
1 |
.T., если второй элемент – это источник события; |
Logical |
2 |
Источник события, если oEventObject – это идентификатор события, или идентификатор события, если oEventObject – это источник события |
Ссылка на объект |
3 |
Событие |
Character |
4 |
Метод, связанный с событием |
" |
5 |
Флаг функции BINDEVENT( ) |
Integer |
Массив ArrayName не изменяется (или не создается), если не существует указанного события; второй параметр равен 0, а AEVENTS( ) вызывается не в момент возникновения события или oEventObject не имеет связанных событий.
Пример. Создается класс OneButtonForm, содержащий один объект – кнопку. Обработчик события Click этой кнопки закрывает, выполняя метод Release, форму. С событием Click кнопки CommandClose формы связывается метод SayWord объекта oHandler типа Inf. При возникновении события Click форма закрывается, однако прежде выполняется метод SayWord: вызывается функция MESSAGEBOX( ), сообщающая "Форма <имя формы> будет закрыта!".
&& Идентификаторы объектов объявляем как PUBLIC
public oForm, oHandler
&& Создаем объект класса OneButtonForm и определяем его свойства:
&& размеры, автоматическое центрирование и видимость
oForm = CreateObject("OneButtonForm")
with oForm
.Width = 300
.Height = 100
.AutoCenter = .T.
.Visible = .T.
&& Определяем свойства кнопки формы: заголовок, размеры и координаты
&& Кнопка в форме центрируется как по горизонтали, так и по вертикали
with .CommandClose
.Caption = "Закрыть"
.Width = 84
.Height = 27
.Left = (oForm.Width – .Width) / 2
.Top = (oForm.Height – .Height) / 2
endWith
endWith
&& Создаем объект типа Inf
oHandler = CreateObject("Inf")
&& Связываем событие Click объекта oForm.CommandClose
&& с процедурой SayWord объекта oHandler
BindEvent(oForm.CommandClose, "Click", oHandler, "SayWord")
&& Формируем массив arrayEvent, содержащий информацию о связанном событии
Aevents(arrayEvent, oHandler)
&& Создаем класс OneButtonForm – форму с одной кнопкой
define class OneButtonForm as Form
add object CommandClose as CommandButton
&&
&& Обработчик события Click кнопки формы
procedure CommandClose.Click
ThisForm.Release
endProc
endDefine
&& Создаем класс Inf, процедура SayWord которого будет выполняться
&& при нажатии на кнопку "Закрыть" формы OneButtonForm
define class Inf as Custom
procedure SayWord
MessageBox("Форма " + _Screen.ActiveForm.Name + " будет закрыта!")
endProc
endDefine
После запуска программы и нажатия на кнопку "Закрыть" на экране появятся 2 окна (рис. 1).
|
|
Рис. 1. Вызвана процедура SayWord
Массив arrayEvent, сформированный AEVENTS( ), содержит следующие данные:
.T. (Object) CLICK SAYWORD 0
Функция
AFIELDS(ArrayName [, nWorkArea | cTableAlias])
размещает в массиве ArrayName информацию о структуре таблицы и возвращает число полей в таблице. Результирующий массив содержит 18 столбцов. Число строк массива равно числу полей таблицы.
Параметры:
nWorkArea – номер рабочей области исследуемой таблицы.
cTableAlias – псевдоним исследуемой таблицы.
Если второй параметр опущен, то в массиве будет размещена информация о таблице в текущей рабочей области. Если в ней таблица не открыта, появится соответствующий диалог открытия файлов.
Содержимое каждой строки массива описано в табл. 6; значения в столбцах 10 – 16 появляются только в первой строке массива.
Таблица 6
Содержимое строки массива, формируемого AFIELDS( )
Номер столбца |
Что содержит |
Тип данных |
1 |
Имя поля |
Character |
2 |
Символ, характеризующий тип поля (C – Character, D – Date, L – Logical, M – Memo, N – Numeric, F – Float, I – Integer, B – Double, Y – Currency, T – DateTime, G – General, Q – Varbinary, V – Varchar and Varchar (Binary), W – Blob) |
" |
3 |
Длина поля |
Numeric |
4 |
Число десятичных знаков |
" |
5 |
Разрешение для NULL-значения |
Logical |
6 |
Запрет на изменение кодовой страницы |
" |
7 |
Выражение проверки поля |
Character |
8 |
Текст проверки поля |
" |
9 |
Значение поля по умолчанию |
" |
10 |
Выражение проверки таблицы |
" |
11 |
Текст проверки таблицы |
" |
12 |
Длинное имя таблицы |
" |
13 |
Выражение триггера вставки |
" |
14 |
Выражение триггера обновления |
" |
15 |
Выражение триггера удаления |
" |
16 |
Комментарий таблицы |
" |
17 |
Следующее значение автоматически увеличиваемого поля |
Numeric |
18 |
Шаг для автоматического увеличения значения поля |
" |
Функция AFONT(ArrayName [, cFontName [, nFontSize | nFontCharSet [, nFlags]]]) помещает информацию о доступных шрифтах в массив ArrayName. Возвращает .T., если массив благополучно сформирован, или .F. – в противном случае. Формируемый массив является одномерным. Если задан только параметр ArrayName, то массив заполнится именами доступных шрифтов.
Параметры:
cFontName – имя шрифта, информация о котором помещается в массив. Если шрифт недоступен, то AFONT( ) вернет .F. Если шрифт может принимать дискретные размеры (8, 10, …), то массив будет заполнен возможными значениями размеров шрифта, число элементом массива будет равно числу возможных размеров шрифта. Если шрифт поддерживает дробные размеры, то массив будет состоять из 1-го элемента, равного –1. Тип параметра – Character.
nFontSize – задает размер шрифта cFontName (nFlags отсутствует или равен нулю). Если указанный параметром nFontSize размер шрифта возможен, то массив будет иметь 1 равный .T. элемент и AFONT( ) вернет .T. Если же невозможен, то массив сформирован не будет и AFONT( ) вернет .F. Если параметр отсутствует или равен –1, то массив в случае дискретного шрифта cFontName заполнится возможными значениями его размеров, в случае недискретного в массиве будет 1 равный –1 элемент. Тип параметра – Numeric.
nFontCharSet – задает набор символов шрифта cFontName (nFlags отличен от нуля). Если указанный параметром nFontCharSet набор символов возможен, то массив будет иметь 1 равный .T. элемент и AFONT( ) вернет .T. Если же невозможен, то массив сформирован не будет и AFONT( ) вернет .F. Тип параметра – Numeric.
nFlags – если отсутствует или равен 0, то третий параметр интерпретируется как nFontSize, и – как nFontCharSet – в противном случае. Если nFlags отличен от нуля и nFontCharSet равен –1, то массив заполняется возможными наборами шрифтов.
Пример. Выводятся имена всех дискретных шрифтов. Для первого дискретного шрифта выводятся допустимые размеры и номера доступных наборов символов.
&& Помещаем имена доступных шрифтов в массив fontNamesArray
if Afont(fontNamesArray) then
firstDFont = .T.
for fontNumber = 1 to Alen(fontNamesArray)
&& Имя шрифта
fontName = fontNamesArray(fontNumber)
&& Помещаем информацию о возможных размерах шрифта в массив fontSizeArray
Afont(fontSizeArray, fontName)
if fontSizeArray(1) != –1 then
&& Печатаем имя дискретного шрифта
? fontName
if firstDFont then
firstDFont = .F.
&& Для первого дискретного шрифта массива fontNamesArray
&& печатаем возможные размеры
display memory like fontSizeArray
&& Затем печатаем номера возможных наборов символов
Afont(fontSetArray, fontName, –1, 1)
display memory like fontSetArray
endif
endif
endFor
endif
Возможный результат:
Courier
FONTSIZEARRAY |
|||
Priv |
A |
test |
|
( 1) |
N |
10 |
( 10.00000000) |
( 2) |
N |
12 |
( 12.00000000) |
( 3) |
N |
15 |
( 15.00000000) |
FONTSETARRAY |
|||
Priv |
A |
test |
|
( 1) |
N |
204 |
( 204.00000000) |
Fixedsys
FoxFont
FoxPro Window Font
MS Sans Serif
MS Serif
Small Fonts
System
Terminal
…
Функция AINS(ArrayName, nElementNumber [, 2]) вставляет в массив ArrayName элемент, если массив одномерный, или строку или столбец, если массив двумерный.
Добавление элемента (строки, столбца) не изменяет формы массива. При вставке элементы сдвигаются по направлению к концу массива последний элемент (строка, столбец) из массива выпадают. Новый элемент или элементы новой строки (столбца) имеют значения .F.
Возвращает 1, если действие выполнено, или 0 – в противном случае.
Параметр:
nElementNumber – задает положение вставляемого элемента (строки, столбца). В случае одномерного массива новый элемент вставляется перед элементом nElementNumber. В случае двумерного массива новая строка (столбец) вставляется перед строкой (столбцом) с номером nElementNumber. При таком способе вставки номер нового элемента (строки, столбца) равен nElementNumber.
2 – обеспечивает в случае двумерного массива вставку столбца. При отсутствии параметра вставляется строка.
Пример. В массив oneDArray вставляется элемент, а в массив twoDArray – строка, а затем столбец. Значения новых элементов выводятся на экран.
dimension oneDArray(7), twoDArray(3, 4)
if set("COMPATIBLE") = "ON" then
set compatible off
endif
store .T. to oneDArray, twoDArray
nElementNumber = 2
&& Вставка второго элемента в одномерный массив oneDArray
Ains(oneDArray, nElementNumber)
? oneDArray(nElementNumber) && Напечатает: .F.
&& Переходим в окне вывода на новую строку
?
&& Вставка второй строки в двумерный массив twoDArray
aIns(twoDArray, nElementNumber)
&& Выводим значения элементов во вставленной строке
for iCol = 1 to 4
?? twoDArray(2, iCol) && Напечатает: .F. .F. .F. .F.
endFor
?
&& Вставка второго столбца в двумерный массив twoDArray
Ains(twoDArray, nElementNumber, 2)
&& Выводим значения элементов во вставленном столбце
for iRow = 1 to 3
?? twoDArray(iRow, 2) && Напечатает: .F. .F. .F.
endFor
Функция AINSTANCE(ArrayName, cClassName) размещает в массиве ArrayName информацию об экземплярах класса cClassName, созданных функциями CREATEOBJECT( ) или NEWOBJECT( ). Возвращает число элементов в сформированном массиве.
В качестве имени класса может быть указано имя как базового класса, так и созданного пользователем. Имена базовых классов VFP см. в табл. 13.2.
Пример.
public oFormA, oFormB
oFormA = CreateObject("OneButtonForm")
oFormB = CreateObject("OneButtonForm")
oFormA.Show
&& Формируем массив arrayIns
Ainstance(arrayIns, "OneButtonForm")
wait arrayIns(1) + ', ' + arrayIns(2) window
&& Создаем класс OneButtonForm – форму с одной кнопкой
define class OneButtonForm as Form
…
endDefine
Сообщение WAIT WINDOW: |
|
Функция ALANGUAGE(ArrayName, nType) формирует массив ArrayName, содержащий имена всех доступных в VFP команд, функция, базовых классов или DBC-событий. Содержание и форма результирующего массива определяются параметром nType.
Пример. Печатаются имена всех функций VFP, имена которых в программах должны записываться без сокращений.
Alanguage(arrayOfFuncNames, 2)
for k = 1 to Alen(arrayOfFuncNames, 1)
if 'M' $ arrayOfFuncNames(k, 2) then
? arrayOfFuncNames(k, 1), arrayOfFuncNames(k, 2)
endif
next
Результат:
COMPROP |
M2-3 |
CREATEOBJECTEX |
M2-3 |
CURSORTOXML |
M2-8 |
DDEABORTTRANS |
M1 |
DDEADVISE |
M4 |
DDEENABLED |
M0-2 |
DDEEXECUTE |
M2-4 |
DDEINITIATE |
M2 |
DDELASTERROR |
M0-1 |
DDEPOKE |
M3-5 |
DDEREQUEST |
M2-4 |
DDESETOPTION |
M1-2 |
DDESETSERVICE |
M2-3 |
DDESETTOPIC |
M2-3 |
DDETERMINATE |
M1 |
DISPLAYPATH |
M2 |
FORCEEXT |
M2 |
FORCEPATH |
M2 |
GETINTERFACE |
M1-3 |
GETWORDCOUNT |
M1-2 |
GETWORDNUM |
M2-3 |
JUSTDRIVE |
M1 |
JUSTEXT |
M1 |
JUSTFNAME |
M1 |
JUSTPATH |
M1 |
JUSTSTEM |
M1 |
XMLTOCURSOR |
M1-3 |
XMLUPDATEGRAM |
M0-3 |
Функция ALEN(ArrayName [, nArrayAttribute]) возвращает число элементов, строк или столбцов в массиве ArrayName.
Параметр:
nArrayAttribute – принимает следующие значения:
0 (или опущен) – функция вернет число элементов в массиве;
1 – функция вернет число строк в массиве;
2 – функция в случае двумерного массива вернет число столбцов в массиве, а в случае одномерного массива – 0.
Пример. Печатаются имена файлов и поддиректорий, отобранных в массив fileArray.
&& Устанавливаем директорию по умолчанию
set default to c:
&& Формируем массив fileArray, занося в него описания системных и скрытых файлов,
&& а также поддиректорий корневого каталога диска с:
if Adir(fileArray, "", "DHS") > 0 then
&& Вывод имен файлов и поддиректорий
&& для определения верхней границы цикла FOR используем ALEN( )
for iRow = 1 to Alen(fileArray, 1)
fileName = fileArray(iRow, 1)
fileAtributes = fileArray(iRow, 5)
do case
case "D" $ fileAtributes
? "Папка ", fileName
case "S" $ fileAtributes
? "Системный" + Iif("H" $ fileAtributes, ", скрытый", "") + " файл", fileName
case "H" $ fileAtributes
? "Скрытый файл ", fileName
endCase
endFor
endif
Возможный результат:
Папка WINDOWSСистемный скрытый файл BOOTFONT.BIN
Системный скрытый файл NTLDR
Системный скрытый файл NTDETECT.COM
Системный скрытый файл BOOT.INI
Папка DOCUMENTS AND SETTINGS
Папка PROGRAM FILES
…
Функция ALINES(ArrayName, cExpression [, nFlags] [cParseChar [, cParseChar2 [, …]]]) копирует каждую строку cExpression в соответствующий элемент одномерного массива ArrayName. Возвращает число элементов в результирующем массиве.
По сравнению с функцией MLINES( ), позволяющей выполнить аналогичные действия, ALINES( ) работает быстрее, программы с ALINES( ) более компактны и, кроме того, на функционирование ALINES( ) не оказывает влияния установка команды SET MEMOWIDTH.
Параметры:
cExpression – символьное выражение или memo-поле, строки которого копируются в массив. Могут быть использованы 2-байтовые символьные строки.
Если cExpression – это пустая строка или NULL-значение, то результирующий массив будет состоять из одного элемента, содержащего пустую строку.
Если cExpression имеет тип Varbinary или Blob, то ALINES( ) создает массив с элементами типа Varbinary.
nFlags – принимает приведенные в табл. 6.12.
Таблица 6.12
Значения параметра nFlags
Бит |
nFlags (сумма) |
Описание |
0 |
1 |
По умолчанию. Удаляет ведущие и хвостовые пробелы в строке; для типов Varbinary и Blob удаляет ведущие и хвостовые нулевые байты |
1 |
2 |
Включает элемент в массив, даже если элемент пустой |
2 |
4 |
Не включает пустые элементы в массив |
3 |
8 |
Задает чувствительные к регистру символы конца строки |
4 |
16 |
Включает символы конца строки в массив |
Функция APROCINFO(ArrayName, cFileName [, nType]) формирует массив ArrayName, содержащий элементы встроенного языка VFP, имеющиеся в PRG-файле cFileName. Возвращает число строк результирующего массива. Параметр nType задает вид информации, записываемой в массив ArrayName. Действие параметра описано в табл. 7.
Таблица 7
Действие параметра nType
nType |
Что содержит массив |
Состав строки массива |
|
Номер |
Что содержит |
||
0 |
Описания всех элементов языка |
1 |
Имя элемента |
2 |
Номер строки в файле |
||
3 |
Вид элемента |
||
4 |
Отступ (используется с директивами #IF для описания их уровня вложенности) |
||
1 |
Описания определений классов |
1 |
Имя класса |
2 |
Номер строки в файле |
||
3 |
Родительский класс |
||
4 |
Является ли OLE-объектом |
||
2 |
Описания процедур классов |
1 |
Имя процедуры, имеющее в качестве префикса имя класса |
2 |
Номер строки в файле |
||
3 |
Описания директив компилятора |
1 |
Имя, определяемое директивой |
2 |
Номер строки в файле |
||
3 |
Вид директивы |
По умолчанию nType = 0.
Вид элемента встроенного языка VFP, может принимать следующие, заносимые в третий столбец массива значения:
Define, если элемент – это директива #DEFINE;
Directive в случае иной директивы компилятора;
Class, если элемент – это определения класса
Procedure, если элемент – это процедура, функция, событие или метод.
Функция полезна на этапе разработки программ и их последующего документирования.
Пример. Функция APROCINFO( ) применяется для анализа следующей программы, хранящейся в файле d:\ProcForProcInfo.prg.
&& Файл d:\ProcForProcInfo.prg
clear
&&
#define NTIMES 3
&&
oAB = CreateObject("APlusB")
&& Идентификатор объекта должен передаваться по ссылке
c = FindC(0, 3, @oAB)
? c
&& Освобождаем объект oAB
release oAB
&&
define class APlusB as Custom
A = 1
B = 2
function AandB
return This.A + This.B
endFunc
endDefine
&&
function FindC(a, b, oAB)
oAB.A = a
oAB.B = b
c = 0
for k = 1 to NTIMES
c = c + oAB.AandB( )
oAB.A = oAB.A + 1
oAB.B = oAB.B + 1
endFor
return c
endFunc
Для вывода результата использован следующий, помещенный в файл d:\goAProcInfo.prg код:
&& Файл d:\goAProcInfo.prg
&& Вызываем APROCINFO( ) с различными значениями параметра nType
for nType = 0 to 3
?
? 'nType = ', nType
&& Формируем массив arrayPRG
AProcInfo(arrayPRG, 'd:\ProcForProcInfo.prg', nType)
for iRow = 1 to Alen(arrayPRG, 1)
? && Переход на новую строку
&& Выводим элементы строки iRow массива на одной строке окна вывода
for iCol = 1 to Alen(arrayPRG, 2)
?? arrayPRG(iRow, iCol), ' '
next
next
next
Результат:
nType = 0 (элементы) |
|||
NTIMES |
3 |
Define |
0 |
APlusB AS Custom |
10 |
Class |
0 |
APlusB.AandB |
13 |
Procedure |
0 |
findC |
18 |
Procedure |
0 |
nType = 1 (класс) |
|||
APlusB |
10 |
Custom |
|
nType = 2 (процедура) |
|||
APlusB.AandB |
13 |
||
nType = 3 (директива) |
|||
NTIMES |
3 |
Define |
Функция ASCAN(ArrayName, eExpression [, nStartElement [, nElementsSearched [, nSearchColumn [, nFlags]]]]) ищет в массиве ArrayName элемент равный eExpression. В случае удачи возвращает номер первого найденного элемента (или номер строки массива); возвращает 0, если поиск не дал результатов. Если нужно независимо использовать параметр nSearchColumn, то для nStartElement и nElementsSearched задаются отрицательные значения. Если нужно независимо использовать параметр nFlags, то вдобавок значение nSearchColumn устанавливается меньшим нуля.
Как и в других функциях значения параметров не должны приводить к нарушению границ массива.
В случае символьных данных по умолчанию поиск чувствителен к регистру имеющихся в eExpression букв.
Параметры:
eExpression – значение для поиска. Возможен любой тип данных.
nStartElement – номер элемента, с которого начинается поиск. В случае двумерного массива номер элемента по его индексам можно получить, употребив AELEMENT( ). При отсутствии параметра поиск ведется с первого элемента.
nElementsSearched – число просматриваемых элементов. При отсутствии параметра поиск ведется вплоть до последнего элемента.
nSearchColumn – номер столбца, в котором ведется поиск. Полезен, в частности, при работе с массивом, созданным функцией AFIELDS( ). Если параметр меньше нуля или равен ему, то поиск ведется во всем массиве (с учетом ограничений, устанавливаемых nStartElement и nElementsSearched). Если положителен, то поиск ведется в столбце nSearchColumn начиная с элемента nStartElement; число участвующих в поиске элементов равно nElementsSearched. Так, в случае массива twoDArray формы 3×4 вызов Ascan(twoDArray, 9, 2, 2, 3) обеспечит поиск равных числу 9 элементов в третьем столбце среди второго и третьего элементов столбца. Вызов Ascan(twoDArray, 9, 2, 3, 3) недопустим, поскольку приводит к нарушению верхней границы третьего столбца.
nFlags – задает дополнительные условия поиска. Принимает значения от 1 до 15 включительно. При наличии параметра функция ASCAN( ) интерпретирует в соответствии с табл. 8 каждый бит параметра.
Таблица 8
Биты параметра nFlags
Бит |
Условия поиска, если значение бита равно 1 |
0 |
Поиск нечувствителен к регистру |
1 |
При поиске SET EXACT установлен в ON; действует, если 2-й бит имеет значение 1 |
2 |
Позволяет изменять (на время поиска) системную EXACT-настройку; если значение бита 0, то при поиске используется системная EXACT-настройка |
3 |
В случае двумерного массива функция ASCAN( ) возвращает номер первой строки, имеющей искомый элемент |
Полный перечень возможных условий поиска приведен в табл. 9.
Таблица 9
Условия поиска, задаваемые параметром nFlags
nFlags |
Биты |
Описание |
0 |
0000 |
Ищет по правилам, существовавшим в VFP версии 6 и в более ранних версиях |
1 |
0001 |
Нечувствителен к регистру |
2 |
0010 |
Ищет по правилам, существующим начиная с версии 7 VFP |
3 |
0011 |
Нечувствителен к регистру |
4 |
0100 |
Exact OFF |
5 |
0101 |
Нечувствителен к регистру, EXACT OFF |
6 |
0110 |
EXACT ON |
7 |
0111 |
Нечувствителен к регистру, EXACT ON |
8 |
1000 |
Возвращает номер строки |
9 |
1001 |
Нечувствителен к регистру, возвращает номер строки |
10 |
1010 |
Возвращает номер строки |
11 |
1011 |
Нечувствителен к регистру, возвращает номер строки |
12 |
1100 |
Возвращает номер строки, EXACT OFF |
13 |
1101 |
Нечувствителен к регистру, возвращает номер строки, EXACT OFF |
14 |
1110 |
Возвращает номер строки, EXACT ON |
15 |
1111 |
Нечувствителен к регистру, возвращает номер строки, EXACT ON |
Пример 1. В одном и том же массиве для найденного элемента сначала возвращается его номер, а затем номер строки.
n = 3
dimension twoDArray(n, n)
for iCol = 1 to n
for iRow = 1 to n
twoDArray(iCol, iRow) = iCol
next
next
&& Массив twoDArray
&& |
1 |
1 |
1 |
&& |
2 |
2 |
2 |
&& |
3 |
3 |
3 |
&& Функция вернет номер элемента
for iCol = 1 to n
?? Ascan(twoDArray, iCol) && Напечатает: 1 4 7
next
?
&& Функция вернет номер строки
for iCol = 1 to n
?? Ascan(twoDArray, iCol, –1, –1, –1, 8) && Напечатает: 1 2 3
next
Функция ASELOBJ(ArrayName, [ 1 | 2 | 3 ]) помещает сведения о текущем элементе управления или контейнере, определенном в проектировщике формы или класса, в массив ArrayName.
При вызове без второго параметра в массив ArrayName заносятся ссылки на выбранные элементы управления. Тип ссылки – Object. Число элементов массива равно числу выбранных элементов управления.
Возвращает 1 при успешном выполнении или 0 – в противном случае.
Параметр:
1 – формируется массив из одного элемента, содержащего ссылку на контейнер выбранного элемента управления.
2 – формируется массив из одного элемента, содержащий ссылку на объект DataEnvironment выбранной формы. Получив эту ссылку, можно, например, изменить свойства объекта.
3 – формирует массив из трех элементов, содержащий контекст текущего окна редактирования данных: ссылка на контейнер объекта, полное имя SCX- или VCX-файла и имя INCLUDE-файла, если таковой имеется.
Функция ASESSIONS(ArrayName) формирует одномерный массив ArrayName, содержащий номера сессий данных. Возвращает число сессий данных. Пример см. в разд. 2.5.12.
Функция ASORT(ArrayName [, nStartElement [, nNumberSorted [, nSortOrder [, nFlags]]]) сортирует элементы массива ArrayName в возрастающем или убывающем порядке. Все участвующие в сортировке элементы должны быть одного типа. Возвращает 1, если сортировка выполнена, или –1 – в противном случае.
Параметры:
nStartElement – задает элемент, с которого начинается сортировка. Если параметр опущен, то массив сортируется начиная с первого элемента. В случае одномерного массива он сортируется начиная с элемента под номером nStartElement. В случае двумерного массива nStartElement определяет строку, в которой начинается сортировка, и столбец, элементы которого сортируются. При сортировке состав каждой строки сохраняется.
Пример. Сортируется по возрастанию двумерный массив формы 4×3 начиная с 4-го элемента, то есть элемента с индексами (2, 1).
Пусть после создания и заполнения
dimension someArray(4, 3)
for k = 1 to 12
someArray(k) = (12 – k) * (-1)**k
endFor
получается следующий массив:
-11 |
10 |
-9 |
8 |
-7 |
6 |
-5 |
4 |
-3 |
2 |
-1 |
0 |
Поскольку элемент, с которого начинается сортировка, расположен во втором ряду, то первый ряд в сортировке участвовать не будет. Сортируются элементы первого столбца, элементы прочих столбцов перемещаются вслед за элементами сортируемого столбца. Поэтому сортировка Asort(someArray, 4) даст следующий результат:
11 |
10 |
-9 |
-5 |
4 |
-3 |
2 |
-1 |
0 |
8 |
-7 |
6 |
nNumberSorted – число сортируемых элементов в одномерном массиве и число сортируемых столбцов в двумерном. Если nNumberSorted опущен или равен –1, то в случае одномерного массива в сортировке участвуют все элементы начиная с nStartElement, в случае двумерного массива в сортировке участвуют все столбцы начиная со столбца, в котором присутствует элемент с номером nStartElement.
nSortOrder – задает порядок сортировки. Если nSortOrder опущен или отрицателен, или равен нулю, то элементы массива сортируются по возрастанию своих значений. Если nSortOrder > 0, то элементы располагаются в убывающем порядке.
nFlags – задает чувствительную, если равен нулю, или нечувствительную, если равен единице, к регистру сортировку. Однако поскольку ASORT( ) использует последовательность сортировки, заданную SET COLLATE, то параметр nFlags имеет действие, если SET COLLATE задана последовательность, чувствительная к регистру, например "MACHINE". Тогда задание nFlags = 1 обеспечит нечувствительную к регистру сортировку. Если же SET COLLATE установлена нечувствительная к регистру последовательность, например, "GENERAL", то задание nFlags = 0 не будет иметь эффекта.
Заключение
В работе были рассмотрены особенности массивов и примеры их использования.
Основное назначение массивов – быстрая обработка данных. Часто разработчики программного обеспечения выполняют с их помощью сортирование информации, манипулирование исходными данными и получение различных выборок из наборов данных. Бытует мнение, что функциональность массивов гораздо проще организовать с помощью применения "толстой" прослойки SQL-кода и обращения к внешним приложениям типа специализированных хранилищ данных. Конечно, такой подход позволяет более просто реализовать элементарные вещи, но вас может ждать небольшое разочарование заказчика в плане быстродействия всего приложения. Представьте себе наиболее часто выполняемые задачи при выводе информации в аналитических системах предприятий - сортировка фамилий сотрудников, выбор товаров в каком-либо ценовом пределе, формирование списка категорий торговых менеджеров вашей организации, хранение оперативных данных о курсе валют. Поскольку выполнение таких элементарных задач (обычно) требует наличия SQL-хранилищ исходной информации и обращения к базам данных, работоспособность и скорость ваших приложений часто зависят от надежности и быстродействия технологического решения SQL-хранилища. Действительно, в случае применения отказоустойчивой системы хранения данных, размещенной на нескольких серверах, использование хранилища данных типа MySQL представляет собой узкое звено всей системы. Представьте себе, что может произойти, если разнесенные рабочие места обращаются к единой информационной таблице с курсами валют, которую по какой-либо причине заблокировало другое неверно работающее приложение. Да и простое обращение сотен компьютеров к одной таблице может очень сильно повредить быстродействию всего процесса работы аналитической системы, написанной на основе использования единого SQL-хранилища данных.
Наверное, такие задачи встречаются в жизни среднего веб-разработчика достаточно редко, но и простое использование функций для работы с массивами в обычной "плоской" задаче очень часто позволяет увеличить быстродействие вашего приложения. Поскольку задачи увеличения скорости работы интерфейсов и обработки данных встречаются в программировании бизнес-логики сплошь и рядом, функции для работы с массивами применяются практически во всех мало-мальски известных языках программирования, которые используются при написании задач аналитического учета.
Список использованной литературы
- Агальцов, В.П. Базы данных. В 2-х т. Т. 2. Распределенные и удаленные базы данных: Учебник / В.П. Агальцов. - М.: ИД ФОРУМ, НИЦ ИНФРА-М, 2013. - 272 c.
- Гамма Э., Хелм Р., Джонсон Р., Влиссидес Дж. Приемы объектно-ориентированного проектирования. Паттерны проектирования. - СПб.:Питер, 2015. – 368 с.
- Голицына, О.Л. Базы данных: Учебное пособие / О.Л. Голицына, Н.В. Максимов, И.И. Попов. - М.: Форум, 2012. - 400 c.
- Давыдова Е. М. Базы данных Учеб. пособие для вузов / Е. М. Давыдова, Н. А. Новгородова. - 3-е изд., перераб. и доп. - Томск : В-Спектр, 2012. - 128 с.
- Дейт К.Дж. Введение в системы баз данных. - К.: Диалектика, 2012. - 360 c.
- Илюшечкин В. Основы использования и проектирования баз данных. Учебник. - М.:Юрайт, 2014. - 214с.
- Карпова, И.П. Базы данных: Учебное пособие / И.П. Карпова. - СПб.: Питер, 2013. - 240 c.
- Кириллов, В.В. Введение в реляционные базы данных.Введение в реляционные базы данных / В.В. Кириллов, Г.Ю. Громов. - СПб.: БХВ-Петербург, 2012. - 464 c.
- Малыхина М. Базы данных. Основы, проектирование, использование. - СПб.: БХВ-Петербург, 2012. - 528с.
- Марков А.С., Лисовский К.Ю. Базы данных. Введение в теорию и методологию: Учебник. – М.: Финансы и статистика, 2015. – 512 с.
- Озкарахан Э. Машины баз данных и управление базами данных. - М.: Мир, 2013. - 551 c.
- Пирогов, В.Ю. Информационные системы и базы данных: организация и проектирование: Учебное пособие / В.Ю. Пирогов. - СПб.: БХВ-Петербург, 2014. - 528 c.
- Советов, Б.Я. Базы данных: теория и практика: Учебник для бакалавров / Б.Я. Советов, В.В. Цехановский, В.Д. Чертовской. - М.: Юрайт, 2013. - 463 c.
- Туманов В.Е. Основы проектирования реляционных баз данных - М.: Бином, 2012. - 420 c.
- Фуфаев, Э.В. Базы данных: Учебное пособие для студентов учреждений среднего профессионального образования / Э.В. Фуфаев, Д.Э. Фуфаев. - М.: ИЦ Академия, 2012. - 320 c.
- Хаббард Дж. Автоматизированное проектирование баз данных - М.: Мир, 2014. - 453 c.
- Ответственность за нарушение законодательства о рекламе (Понятие и виды рекламы)
- Осуществление субъективных гражданских прав (Понятие осуществления субъективных гражданских прав)
- Особенности развития инновационного предпринимательства
- Проблемы коммуникаций в современных организациях (Содержание, тенденции развития и роль коммуникационного менеджмента в эффективной деятельности организации)
- Разработка маркетинговой стратегии предприятия (Сущность и значение маркетинговой стратегии предприятия)
- Понятие оперативно-розыскной деятельности (Понятие и история становления оперативно – розыскной деятельности)
- Прекращение обязательств (Совпадение должника и кредитора в одном лице)
- Рынок систем бронирования в гостиничной индустрии («Невский Гранд»)
- Авторитет и лидерство в системе менеджмента
- Особенности управления организациями в современных условиях и пути его совершенствования.
- Моделирование предметной области «Управление логистикой» с помощью UML
- Разработка конфигурации “Управление товарными потоками” в среде 1С:Предприятие 8.3