Создание и присваивание массива в 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) Замечание. Массив 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 нужно убедиться, что сравниваемые значения имеют один тип. |