Страница 1 из 1

запуск метода (процедуры) по адресу

Добавлено: 12 Декабрь 2008, 12:38
vd-vuf
c6.3
что то не могу пробится
суть.
есть класс
в нем много методов
в зависмости от задачи нужно запустить по очереди нескоько методов в определенном порядке.
на данный момент это сделано так, в queue записываются номера событий
ну и потом счтиваются записи по очереди
а какую процедуру запустить определяется по CASE (case получился очень длинный) ну и плюс ко всему, неудобно при разработке
описать соьбытие (EQUATE), в CASE связать событие с процедурой (если забыл то косяк),
Хотелось бы проще, в QUEUE запихиваем очередь из адресов процедур
а потом запускем их по очереди :)

близкое решение.. завалялся у меня чейто пример:
Member()
MAP
ExternalProcedure(),BYTE,TYPE
CallAddr(*ExternalProcedure),BYTE,PROC,NAME('CallAddr')
END

CallAddr Function(Ptr)
CODE
RETURN Ptr()

НО, если вызваем CallAddr(myprocedure) то все ок
если вызывать CallAddr(SELF.myMetod)
то клаша матерится уже во время компиляции, говорит что прототип не тот.

Re: запуск метода (процедуры) по адресу

Добавлено: 12 Декабрь 2008, 12:51
Yufil
Self.Mymethod имеет в качестве первого параметра ссылку на объект.
Если передаёшь метод Self.Method(Params), надо его тип описывать как Procedure(*Object,Params) . Ну и, соответственно, передавать ссылку на объект переходнику.

Re: запуск метода (процедуры) по адресу

Добавлено: 12 Декабрь 2008, 14:47
vd-vuf
неполучается :/
Yufil, нада на пальцах :)


В MAP прописано
TestProcType(),TYPE
--------
MODULE('SSOPS012.CLW')
CallTest PROCEDURE(*TestProcType UsingProc)
END

CallTest PROCEDURE (*TestProcType UsingProc) ! Declare Procedure
CODE
UsingProc
----------
В другой процедуре юзается класс

SwitchCl CLASS(SwitchClient)
TestMessage PROCEDURE
GoCallTest PROCEDURE
END

SwitchCl.TestMessage PROCEDURE
CODE
MESSAGE('UsingProc')

SwitchCl.GoCallTest PROCEDURE
CODE
CallTest(SELF.TestMessage) ! < тут ошибка

Re: запуск метода (процедуры) по адресу

Добавлено: 12 Декабрь 2008, 16:46
Yufil
Ну, ты описал динамический вызов процедуры БЕЗ ПАРАМЕТРОВ.
А метод класса имеет параметры. Class.Method(...) является синонимом Method(*Class,....) . Это процедура не может быть без параметов, у неё как минимум один параметр.

Привожу пример динамического вызова по адресу с параметром String

StrProc(String),Type
CallStrProc(Long,String),Name('CallProc')
CallProc(StrProc,String),Name('CallProc')

CallProc PROCEDURE (Proc,Param),Name('CallProc')
CODE
Proc(Param)

И теперь можно вызывать CallStrProc( Address(MyProc),String)
А теперь поменяй String на *Class ...

Re: запуск метода (процедуры) по адресу

Добавлено: 12 Декабрь 2008, 21:00
vd-vuf
Yufil, СПАСИБА, очередной раз выручил :)
расклад такой

Код: Выделить всё

    TestProcType(*SwitchClient),TYPE
   MODULE('') ! методом тык завернул объявление в module, иначе клаша ругалась на муссинг 
     CallStrTestProc(LONG,LONG),Name('CallTestProc')
   END
   CallTestProc(TestProcType,*SwitchClient),Name('CallTestProc')

CallTestProc  PROCEDURE (Proc,Param) !,Name('CallTestProc')
  CODE
  Proc(Param)

SwitchCl CLASS(SwitchClient)
TestMessage PROCEDURE
GoCallTest    PROCEDURE
             END

SwitchCl.TestMessage PROCEDURE
  CODE
  MESSAGE('UsingProc')

SwitchCl.GoCallTest PROCEDURE
  CODE
  CallStrTestProc(ADDRESS(SELF.TestMessage),ADDRESS(SELF))