adimetrius писал(а):
При выгрузке модулей та же проблема вообще с любыми указателями: выгрузили М, а переменная п: М.Т осталась, и попытки вызвать связанные с М.Т процедуры - тоже в никуда. И в текущей реализации (в линукс) последствия непредсказуемы, т.к. платформенная защита памяти от исполнения не используется. Но, как я понимаю идеологию ББ: выгрузка модулей - действие этапа разработки, в "боевой системе" этого делать не следует; поэтому соответствующие защиты не реализованы.
В BlackBox`е для Windows импортируемый модуль можно выгрузить только после импортирующего.
Обычно я использую абстрактные процедуры когда надо описать что-то общее, универсальное, детали которого ещё не известны. Например, я абстрактные процедуры использовал для сортировки, когда сортирующая программа ничего не знает о ключах, по которым сравниваются два элемента:
Код:
CONST
AsmallerB = 1;
AequalB = 2;
AlargerB = 3;
TYPE
Element = POINTER TO ABSTRACT RECORD
END;
List = RECORD
elements: ARRAY 100 OF Element;
END;
PROCEDURE (a: Element) Compare* (b: Element): BYTE, NEW, ABSTRACT;
PROCEDURE (VAR obj: List) Sort*, NEW;
VAR
i: INTEGER;
...
BEGIN
...
CASE obj.elements[i].Compare (obj.elements[i+1]) OF
AsmallerB: ...
| AequalB: ...
| AlargerB: ...
ELSE
...
END
...
END Sort;
Мне сейчас непонятно, как пользоваться процедурой, передаваемой как параметр. А именно, как указать тело этой процедуры, и как её вызвать? Она что, вызывается при присваивании?