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


Глава 11. Создание слов-определителей - часть 13


Запись данных за пределами резервированной области может привести к катастрофическим последствиям. Поэтому корректное решение задачи состоит в том, чтобы написать слово, которое производит проверку значения номера элемента массива, прежде, чем его использовать для работы с определенным массивом, на допустимость, т.е. попадание его в область разрешенных значений. Однако включение проверки в опреде ление массивов ARRAY и CARRAY приведет к снижению быстродействия, независимо от того, будет обнаружена ошибка или нет. Если скорость не очень важна, то можно переписать определения массивов, включив в них проверку ошибок. В таком случае в слово, определяющее массив, наряду с размером резервированной для массива области должно быть скомпилировано число элементов (чтобы использовать для проверки). Если принять, что номер младшего элемента массива равен 0, то одним из возможных определений, выполняющих проверку, может быть : ECARRAY ( n --) CREATE DUP , 2+ ALLOT DOES> DUP @ 3 PICK SWAP U< ( 2 PICK для Форт-83) IF + 2+ ELSE ." Ошибка индекса" ABORT THEN :

Приведенное определение можно расчленить на отдельные действия следующим образом: : ECARRAY (Имя определяющего слова) CREATE (Создает заголовок слова-ребенка) DUP (Копирует число элементов массива в стеке) (Помещает в слово-ребенок адрес кода стадии исполнения) , (Компилирует максимальный номер элемента) 2+ (Устанавливает число байтов, необходимых для компиляции массива) ALLOT (Резервирует в словаре место для массива) DOES> (Определяет поведение слова-ребенка при исполнении) (Номер элемента находится в стеке) (Оставляет в стеке адрес содержимого слова-ребенка) DUP ( -- n адр адр ) @ ( -- n адр макс ) (Максимальная размерность массива) 3 PICK ( -- n адр макс n ) (Номер элемента) (2 PICK для Форт-83) SWAP ( - n адр n макс ) U< (Номер элемента меньше допустимого?) IF (Если номер меньше допустимого...) + (Вычисляет адрес элемента и) 2+ (смещение для обхода максимального значения) ELSE (Но, если номер элемента слишком большой) ." Ошибка индекса" (то выдает сообщение об ошибке) ABORT (очищает стек и прекращает работу) THEN ; (Заканчивает определение)




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