ИНИЦИАЛИЗАЦИЯ МАССИВА
Во многих ситуациях требуется массив со значениями, которые во время выполнения прикладной программы никогда не меняются и могут быть загружены в этот массив во время его создания по аналогии с константами, создаваемыми с помощью CONSTANT Для осуществления этих действий в Форте предусмотрено слово , (ЗАПЯТАЯ).
Предположим, вы хотите, чтобы значения массива ПРЕДЕЛЫ были постоянными. Тогда вместо выражения VARIABLE ПРЕДЕЛЫ 8 ALLOT
необходимо ввестиCREATE ПРЕДЕЛЫ 220 , 340 , 170 , 100 , 190 ,
Как правило, приведенная выше строка должна вводиться из дискового блока, но ее можно вводить и непосредственно с экрана.
Напоминаем вам, что слово CREATE во время компиляции вносит новое имя в словарь, а во время выполнения доставляет адрес своего определения. Но оно не «выделяет» какое-то число байтов под значение.
Слово , берет число из стека и помещает его в массив. Поэтому всякий раз, когда вы записываете число и ставите за ним запятую, вы добавляете к массиву одну ячейку1.
1 Для начинающих. Укоренившиеся привычки грамотно писать фразы на естественном языке приводят к тому, что некоторые новички забывают написать последнюю запятую в строке. Помните, что «,» не разделяет числа, а компилирует их
Доступ к элементам массива, созданного с помощью CREATE, обеспечивается точно так же, как и к элементам массива, созданного посредством VARIABLE, например: ПРЕДЕЛЫ 2+ ? 340 ok
Вы даже можете помещать в этот массив новые значения так, как если бы работали с массивом, созданным с помощью VARIABLE, но только в том случае, кода вы не собираетесь пропустить свою прикладную программу через целевой компилятор.
Для того чтобы сформировать массив байтов, можно воспользоваться С,. Например, мы могли бы загрузить каждое из значений в нашем определении слова КАТЕГОРИЯ при сортировке яиц, следующим образом- CREATE РАЗМЕРЫ 18 С, 21 С, 24 С, 27 С, 30 С, 255 С,
Это позволило бы переопределить слово КАТЕГОРИЯ посредством оператора цикла DO, а не рядом вложенных операторов IF ...
THEN, в частности':
1 Для тех, кто не любит докапываться до сути самостоятельно. Суть дела состоит в следующем. Так как у нас пять возможных категорий, можно использовать номер категории как индекс для цикла При выполнении каждого шага цикла мы сравниваем число из стека с элементом массива РАЗМЕРЫ, отстоящим от начала массива на смещение, равное текущему индексу цикла. Как только вес в стеке превысит значение очередного элемента массива, мы завершим цикл и с помощью I определим, сколько раз цикл выполнялся до того, как мы вышли из него Поскольку это число представляет собой смещение в нашем массиве, то оно также является и номером категории
: КАТЕГОРИЯ t вес-ма.~дм*иму -- иенер-категории } 6 0 DO DUP РАЗМЕРЫ I + С@ < IF DROP I LEAVE THEN LOOP ;
Заметьте, что мы добавили к массиву максимальное значение (255), что дает возможность упростить наше определение для категории 5
Этот новый вариант более изящен и более компактен по сравнению с прежним.
Ниже приводится перечень слов Форта, с которыми вы познакомились в данной главе. VARIABLE ххх ( -- ) Создание переменной с именем ххх. ххх ( -- а) Слово ххх при выполнении помещает в стек свой адрес. ! ( n а --) Запоминание числа одинарной длины по заданному адресу. @ ( a -- n) Замещение адреса его содержимым. ? ( а --) Вывод значения по заданному адресу с последующим пробелом. +! ( n а --) Сложение числа одинарной длины с содержимым заданного адреса.
CREATE xxx ( -- ) Создание заголовка в словаре с именем xxx. xxx: ( -- a) Слово xxx при выполнении заносит в стек свой адрес
ALLOT ( n -- ) Резервирование в поле параметров слова, определенного последним, n дополнительных байт.
С! ( b a -- ) Занесение 8-разрядного числа по заданному адресу. С@ ( а -- b ) Выборка 8-разрядного числа по заданному адресу.
FILL (ЗАПОЛНИТЬ) ( a u b -- ) Заполнение n байтов памяти, начиная с заданного адреса, значением Ь.
ERASE (ОЧИСТИТЬ) ( а n -- ) Заполнение n байтов памяти, начиная с заданного адреса, нулями.
CONSTANT xxx ( n -- ) Создание константы с именем xxx и xxx: ( -- n) значением n.Слово xxx при своем выполнении заносит в стек n. FALSE ( -- f) Занесение в стек логического значения ложь ( 0 ). TRUE ( -- t) Занесение в стек логического значения истина ( —1 ).
Операции двойной длины:
2VARIABLE xxx ( -- ) Создание переменной двойной длины ххх: ( -- a) с именем ххх. Слово ххх при выполнении помещает на стек свой адрес. 2CONSTANT ххх ( d -- ) Создает константу двойной длины с именем ххх и значением d. ххх: ( -- d) Слово ххх при выполнении помещает в стек значение d. 2! ( d а -- ) Запоминание числа двойной длины по заданному адресу. 2@ ( а -- d) Занесение в стек числа двойной длины, расположенного по заданному адресу.
Условные обозначения:
n, n1 ... - 16-разрядные числа со знаком; а - адрес; d, d1 ... - 32-разрядные числа со знаком; u, u1 ... - 16-разрядные числа без знака;