Язык программирования Форт


Глава 10. Хранение программ и данных - часть 25


В таком виде слово GETPILE можно использовать для создания файла из любого набора блоков, номера которых хранятся в массиве DATA. Если массив номеров блоков устроен так же, как DATA, то слово GETFILE используется в такой форме: DATA GETFILE METFILE

Теперь нужно сконструировать слова для обеспечения доступа к данным в метафайле. Вспомним, что в каждой записи имеется по четыре элемента (в 8 байтах). Поэтому запись номер 1 начинается с 0-го байта файла, запись номер 2 - с 8-го, запись номер 3 - с 16-го и т.д. Если нам нужен третий элемент данных из записи номер 200, то мы можем извлечь его из метафайла с помощью такой последовательности действий: METFILE 200 1- 8 * + 3 1- 2* @

Можно будет упростить эту операцию, если определить еще несколько слов. Причем можно сделать эти определения достаточно общими, чтобы пользоваться ими впоследствии для любого метафайла с любой длиной записей. Сначала определим переменную для хранения длины записи: VARIABLE RECLEN 8 RECLEN !

Затем определим переменную, указывающую на позицию начала записи, которая будет использоваться в такой форме: 200 METFILE RECLOC чтобы поместить в стек адрес начала 200-й записи в файле. Вот это определение: : REGLOC ( n адр -- адр ) SWAP 1- RECLEN @ * + ;

Теперь опишем слово DATALOC для вычисления адреса любого элемента заданной записи, которое, например, в случае 3 200 METFILE DATALOC будет возвращать в стек адрес начала 3-го элемента данных в записи номер 200. Вот определение этого слова: : DATALOC ( n1 n2 адр1 -- адр2) RECLOC SWAP 1- 2* + ;

С помощью этих общих слов мы можем определить слова для извлечения конкретных данных из нашего файла, т.е. для извлечения, например, данных о температуре, влажности воздуха и т.д. Мы выпишем их в последовательности, в которой они записаны в метафайле: : TEMP 1 SWAP METFILE DATALOC ; (Температура) : HUMID 2 SWAP METFILE DATALOC ; (Влажность) : WIND 3 SWAP METFILE DATALOC ; (Скор. ветра) : BAROM 4 SWAP METFILE DATALOC ; (Давление)

Тогда если вы введете 200 WIND @ то получите скорость ветра в 200-й записи. (Как вы узнаете в гл. 11, эти четыре слова можно определить еще лучше, если применить специальное слово-определитель в конструкции CREATE...DOES>.) Наконец, было бы неплохо определить слово, позволяющее по значениям номера дня относительно начала текущей серии данных, по значениям часа и минуты возвращать в стек номер записи, относящейся к этой дате.


- Начало -  - Назад -  - Вперед -