Распечатать страницу

Создание и присваивание массива в Visual 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).

Замечание. Массив VFP не должен занимать более 2 ГБ (см. в справке разд. System Capacities).

Создать массив, как и иную переменную, можно в любом месте программного компонента. Кроме того, в команде, создающей массив, для указания формы массива можно использовать не только константу, но и переменную, например:

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

нужно убедиться, что сравниваемые значения имеют один тип.