OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 17:17

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
СообщениеДобавлено: Суббота, 12 Август, 2017 08:49 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Очень нужно решить следующую проблему. При передаче инструкции параллельно работающему блэкбоксу требуется передать, какую процедуру ему необходимо выполнить для обработки данных. В виде строки я научился передавать и запускать с помощью Meta: https://gitlab.molpit.org/idenisov/Robu ... /Demo4.odc

Код:
...
         Meta.LookupPath(c.pName, item);
         IF (item.obj = Meta.procObj) OR (item.obj = Meta.varObj) & (item.typ = Meta.procTyp) THEN
            item.GetVal(item0, ok);
            IF ok THEN c.p := item0.p END
         END
...


Но как получить эту строку вида Модуль.Процедура, имея только процедурную переменную?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 12 Август, 2017 13:09 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Как-то возился с поиском адреса метода (тоже процедура), это не конкретное решение, но можно посмотреть куски кода viewtopic.php?f=127&t=4940&hilit=+%D0%BC%D0%B5%D1%82%D0%BE%D0%B4 вкратце, у каждого модуля есть список процедур, они в дескрипторе лежат, и адрес тела этой процедуры в памяти. Любая процедурная переменная тоже хранит этот адрес процедуры, можно пробежаться и сравнить.
Модули как объекты разложенные в связный список, как они есть в памяти, лежат в Kernel.root кажется, не могу сейчас посмотреть точнее.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 12 Август, 2017 20:53 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Спасибо, Пётр, поглядел твои эксперименты. И потом еще DevDebug поизучал более настойчиво. Придумал решение:

Код:
      c.pName := "";
      (* получаем имя процедуры *)
      Kernel.SearchProcVar(SYSTEM.VAL(INTEGER, c.p), mod, adr);    (*  c.p  =  процедурная переменная  *)
      IF mod # NIL THEN
         IF mod.refcnt >= 0 THEN
            ref := mod.refs;
            REPEAT
               Kernel.GetRefProc(ref, n, procName);
            UNTIL (n = 0) OR (n > adr);
            IF n > 0 THEN
               Kernel.GetModName(mod, modName);
               Strings.Utf8ToString(procName, name, res);
               (* записываем полное имя процедуры для передачи другому Блэкбоксу *)
               c.pName := modName + "." + name     (* <===== результат  *)
            END
         ELSE
            Log.String("module unloaded"); Log.Ln
         END;
      END;


Файл с примером обновил тоже в хранилище.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB