Главная » Статьи » FreePascal |
Озаботился подготовкой справочной информации по модулям реализации дерева парсинга аналитических выражений. Для подготовки файлов в формате CHM использовал редактор документации LazDE, который идет в установочном пакете Lazarus'а. В ходе работы обнаружил, что про добавлении ссылок в раздел See Also, они не сохраняются в секции <seealso> XML файла описания. Соответственно, это приводит к тому, эти ссылки отсутствуют и в файле справочной информации. Изучение исходных текстов LazDE привело к следующему месту в файл $(LazarusDir)\doceditor\freditor.pp: 420 Function TElementEditor.CurrentXML : String; Процедура SplitLinkText, отмеченная в строке с номером 449, расположена в этом же файле и имеет следующее объявление: Procedure SplitLinkText(LT : String; out lblShortDescr,T : String); Последние два параметра объявлены с типом out (output parameters), особенности применения которых описываются в Reference guide for Free Pascal, version 3.0.2 следующим образом: The purpose of an out parameter is to pass values back to the calling routine: the variable is passed by reference. The initial value of the parameter on function entry is discarded, and should not be used. Что же происходит в нашем случае? Это становится ясно из ассемблерного файла, который получается при компиляции модуля с опцией -al. Рассмотрим это при компиляции для x86_64-win64. И так отмеченный ранее вызов SplitLinkText: //Win64 ========================================================== То есть для всех трех параметров передаются адреса соответствующих переменных. При этом для третьего и первого параметра передается один и тот же адрес переменной LT. Кроме того для двух последних параметров, которые описаны с типом out, выполняется декремент счетчика референций (ссылок), и, если этот счетчик становится равным нулю, то содержимое соответствующей строки теряется! Посмотрим теперь на пролог процедуры SplitLinkText: //Win64 ========================================================== Здесь видно, что в прологе данной процедуры выполняется обнуление содержимого строк второго и третьего параметров, имеющих тип out. Но ранее мы видели, что при рассматриваемом нами вызове процедуры для третьего параметра передается тот же адрес что и для первого параметра. Таким образом содержимое исходной строки теряется на этапе пролога процедуры SplitLinkText. Исправляется данная ошибка просто: 420 Function TElementEditor.CurrentXML : String; Все! Редактор успешно работает! | |
Просмотров: 213 | Комментарии: 1 | | |
Всего комментариев: 1 | |
| |