Решил проверить на КП некоторый упрощённый способ ООП реализации обработки сообщений по модели Подписчики-Рассыльщик и наткнулся на непонятную ошибку при запуске:
Цитата:
illegal memory read
. Что это может значить?
Проверено в BBCB 1.6 rc5.
Код:
MODULE PrivSubscription;
CONST
MaxItems = 10;
TYPE
Object* = EXTENSIBLE RECORD END;
BasicSubscriber* = POINTER TO ABSTRACT RECORD END;
Subscribers* = ARRAY MaxItems OF BasicSubscriber;
SubscriberList = RECORD
items: Subscribers;
count: INTEGER
END;
Message* = RECORD(Object)
text-: ARRAY 30 OF CHAR
END;
Parameter* = RECORD(Object) END;
SubscriberManager* = RECORD
list: SubscriberList
END;
PROCEDURE (VAR M: Message) Set* (IN text: ARRAY OF CHAR), NEW;
BEGIN
M.text := text$
END Set;
PROCEDURE (S: BasicSubscriber) InterpretMessage* (VAR m: Message; VAR p: Parameter), NEW, ABSTRACT;
PROCEDURE (VAR L: SubscriberList) New (s: BasicSubscriber), NEW;
BEGIN
L.count := 0
END New;
PROCEDURE (VAR L: SubscriberList) Add (s: BasicSubscriber), NEW;
BEGIN
ASSERT(L.count < MaxItems);
INC(L.count);
L.items[L.count - 1] := s
END Add;
PROCEDURE (VAR L: SubscriberList) Each (m: Message; p: Parameter), NEW;
VAR i: INTEGER; s: BasicSubscriber;
BEGIN
FOR i := 0 TO L.count - 1 DO
s := L.items[i];
s.InterpretMessage(m, p)
END
END Each;
PROCEDURE (VAR M: SubscriberManager) AddSubscriber* (s: BasicSubscriber), NEW;
BEGIN
IF M.list.count < MaxItems THEN M.list.Add(s) END
END AddSubscriber;
PROCEDURE (VAR M: SubscriberManager) DeliverMessage* (m: Message; p: Parameter), NEW;
BEGIN
M.list.Each(m, p)
END DeliverMessage;
END PrivSubscription.
Код:
MODULE PrivSubscriptionDemo;
IMPORT Subscription := PrivSubscription, StdLog;
TYPE
MySubscriber = POINTER TO RECORD(Subscription.BasicSubscriber) END;
PROCEDURE (S: MySubscriber) InterpretMessage (VAR m: Subscription.Message; VAR p: Subscription.Parameter);
BEGIN
StdLog.String("Interpreter of MySubscriber");
StdLog.String(m.text)
END InterpretMessage;
PROCEDURE Do*;
VAR
msg: Subscription.Message;
parameters: Subscription.Parameter;
mySubscriber: MySubscriber;
manager: Subscription.SubscriberManager;
BEGIN
msg.Set("Message");
NEW(mySubscriber);
manager.AddSubscriber(mySubscriber);
manager.DeliverMessage(msg, parameters)
END Do;
END PrivSubscriptionDemo.
PrivSubscriptionDemo.Do