МАССИВЫ, ФАЙЛ-МАССИВЫ И РЕГИОНЫ |
CAPER предоставляет определенное разнообразие в организации массивов данных.Массивы CAPER различаются по месту организации: в оперативной памяти или в файле; а так же по способу организации и времени жизни: динамически или статически. private <int> [100,200] arrInt, => . . . build arrInt, arrOfStructures В то же время, для переменных массивов без указания размерностей позволяется использовать оператор build только в параметризованной форме. Такие переменные служат также для получения указания на уже созданный массив и последующего их использования. Пример: private <int> [] aInt, => build aInt ;* вызовет ошибку компиляции build refToArr ;* вызовет ошибку компиляции Мы можем использовать объявленные переменные в следующих качествах: после построения (см. выше) refToArr := arrOfStructures aInt[10] := refToArr[ 1, 3, 7 ].element ** 2 Обращаем внимание на то, что в первом примере была объявлена переменная
refToArrOfStructures, но собственно носитель массива построен не был. Данную
переменную можно использовать для хранения указания создаваемых другими способами массивов: Так как размерности массива для refToArrOfStructures определены, то адресование элементов массива будет формироваться компилятором на основе данных размерностей: refToArrOfStructures[ 2, 2, 1 ] будет указывать на элемент Тем самым мы можем организовывать локализованное адресование фрагментов массивов. Для создания статичных массивов может быть использован оператор static build и блоки-массивы. Динамические массивы могут быть созданы функцией виртуальной машины array( < тип >, < инициализатор >, < количество элементов 1>, . . . , < тип > - тип элемента массива. Значение <инициализатора> должно быть согласовано с установленным типом. Так, если зафиксирован числовой тип, то инициализатором должно быть число.Если определен строковый тип, то инициализатор должен быть строкой. В этом DelArray( <указание массива> ) Примеры: /* Будет создан неинициализированный пятимерный массив целых чисел со знаком /* Двухмерный массив беззнаковых полуслов, инициализированных числом 10 */ /* Двухмерный массив мест. Каждый элемент массива находится в состоянии /* Массив строк, инициализированных "ABC", длина каждого элемента равна 4 */ /* Массив 20-ти байтовых элементов */ Статические массивы создаются блоками block <имя блока> as array( <тип>, <инициализатор>, < количество 1>, ... , Элементы массивов адресуются традиционным способом: <имя переменной>[ <элемент 1> , <элемент 2> , . . . , <элемент N> ] < элемент J > - выражение, задающее число. Каждая координата массива адресуется от 1, т.е. первым элементом массива для, например, var3 является
var4[1,1,1], вторым - var4[1,1,2], и т.д., поочередным увеличением координат до
значения var4[3,4,5]. var3[ 0 , 5 ] == var3[ 1 , 2 ] == var3[ 2 , 0 ] Заметим, что элементы массивов именно адресуются. Как правило, внешне это
сводится к выбору значения адресуемого элемента, за исключением операции
присваивания ":=", по которой осуществляется размещение значения в область элемента массива. Участие элемента массива в вызовах блоков так же сводится к размещению значений элементов массива. Однако в некоторых функциях среды в качестве отдельных параметров передаются именно адреса элементов массивов, а не их значения. var := arr[5] <> 10 Очевидно, что подобные операции чреваты выходом за границы массива с известными последствиям. String( <длина строки> [, <символ заполнения> ] ) <длина строки> - число; выделяется память <длина строки> + 1; последний байт заполняется нулем. var := string( 10, ‘a’ ) Здесь десять байтов будут заполнены символом ‘a’, 11-ый бай – 0. Удаление строки реализуется DelString( <указание строки> ) Для переменной var, хранящей указание строки (см. выше), это В языке CAPER введено понятие файл-массива - инструмента управления файлами фиксированной длины таким же способом, как и массивами. farray( < указание файла > , < тип > , < инициализатор >, < указание файла > - строка указания файла (имя файла). Все остальные параметры имеют то же значение, что и в функции array. public var1, var2, var3, var4 var1 := farray( "e:\CAPER3\Data\file1.arr" ) ;* файл private i := 9, j var1[ i ] := 'O', var1[ i +1 ] := 'k' * Значение в var3[ 1 ] == 79 ( десятичное значение ASCII-кода => /* Присвоение элементу файл-массива означает запись в файл в соответствующую позицию. При необходимости управления доступом к файл массиву нужно использовать места: places pLVar1, pLVar2 flock( @pLVar1, READ_ONLY ) Так же при flock( @pLVar1, WRITE_ONLY ) Однако ничто не запрещает создание другого файл-массива pLVar2 := farray( "e:\CAPER3\Data\file2.arr" , 'W', null , 320, 240 ) и манипуляцию его элементами без ограничений: pLVar2 - открытое место. Особое место в системе массивов CAPER занимают массивы переменных и мест. Так, допустимы: var1 := array('H', null, 20,30,40) или непосредственно var2[ 2, 4 ] := farray( "e:\CAPER3\Data\file2.arr", 'W', null, 320, 240 ) Разрешено: var2[ 2, 4 ] [ 10 , 30 ] - указывает на элемент файл-массива. /* Массивы мест позволяют оперировать своими элементами так же, как и обычными местами: lockf( var[ 3 , 4 ] , READ_ONLY ) что не позволит использовать данный элемент по записи. К статичным массивам относятся блоки всех типов (о них подробнее в описании
определителей блоков). Region( <указание массива>, <коорд. начала1>, <коорд. конца1> ArrSize( <массив> ), которая возвращает количество байтов в массиве <массив>. arrVar := array( 'I' , 0 , 100 ) ElemAsStr() - возвращает указатель на элемент любого массива как на элемент строки. arrVar := array( 'H' , 0 , 100, 20 ) // Будет веведенно: Hello! outText( 20, 20, strPtr ) |