Получить данные модуля без использования функции чтения

Я пытаюсь добраться до атрибутов во входящих и исходящих ссылках нескольких объектов, и моя цель - не перечитывать один и тот же модуль снова, сохраняя прочитанный модуль в списке пропуска и проверяя список пропуска перед чтением модуля в следующий раз. около.

Итак, мой вопрос: как мне получить данные имени модуля, которые я сохранил в списке пропуска, если он уже открыт ранее? Будет ли достаточно строки m2 = module item str2 для замены функции чтения, если этот модуль был открыт ранее?

Ниже моя попытка получить атрибуты внутренних ссылок объекта:

Skip sInlink = create()

void get_object_inlinks (Object obj)
{
   string str, str2
   LinkRef lk = null
   Object o = null

   for lk in all (obj <- "*") do
   {
     ModName_ mn = source(lk)
     str = fullName(mn)
     if (!find(sInlink, str, str2))
     {
        m2 = read(str, false)
        put(sInlink, str, str)
     }
     else
        m2 = module item str2

     if (m2 != null)
     {
        o = gotoObject(sourceAbsNo(lk), m2)
        // get object o attributes
        ...
     }
   }
}

person Tuon Can    schedule 29.05.2013    source источник


Ответы (1)


Есть ли причина, по которой вы не хотите перечитывать модуль? Когда модуль открыт, его повторное чтение не приводит к повторному открытию модуля, если только вы не закрываете его каждый раз.

Однако альтернативой является сохранение дескриптора модуля в списке пропуска вместо имени модуля.

put(sInlink, str, m2)

Тогда вместо:

if(!find(sInlink, str, str2))

использовать:

if(!find(sInlink, str, m2))

Если найден str, он поместит дескриптор модуля в m2, если нет, вы можете продолжить чтение, как вы это делаете.

И на всякий случай, если у вас его еще нет, вы должны просмотреть список пропуска и закрыть все модули в конце вашего кода.

for m2 in sInlink do
{
  if(!null m2) close m2
}

Удачи!

person Steve Valliere    schedule 03.06.2013
comment
Благодарю вас! Теперь я сохраняю дескриптор модуля, как вы предложили. Причина, по которой я не хотел перечитывать модуль, - проблема с памятью. Мой скрипт будет обрабатывать более 300 модулей, и каждый модуль имеет сотни ссылок. Мне нужно открыть связанные модули, чтобы прочитать некоторые атрибуты и сравнить их с родительским модулем. - person Tuon Can; 17.08.2013
comment
Если этот ответ помог, сообщите другим, приняв его как ответ на свой вопрос. - person Steve Valliere; 20.08.2013