KLIMaka
Пользователь
Posts: 72
|
|
import procedure с аргументами
« on: 15 March 2009, 14:43:14 » |
|
Столкнулся с такой проблемой - при вызове импортируемой процедуры с аргументами, фол слетает с ошибкой доступа к памяти. Но если импортируемая процедура без параметров, то все чики-пуки. В чем, собсно, соль? Я так понимаю, что со стеком чудеса происходят, ибо аргументы нужно пушить в стек объекта, из которого процедура импортируется, но толи это не делается, толи делается криво... Есть у кого информация по этому поводу?
|
|
|
|
Alchemist
Модератор
Posts: 117
Ортодоксальный Сектант
|
|
Re: import procedure с аргументами
« Reply #1 on: 15 March 2009, 15:48:57 » |
|
Исчерпывающего ответа у меня, к сожалению, нет. Однако я знаю две вещи. В оригинальных скриптах игры импорт и экспорт процедур не используется вообще. А так же, в оригинальных скриптах нет процедур с параметрами, всё делается через переменные. Думаю, это неспроста.
|
//Это добром не кончится...
|
|
|
KLIMaka
Пользователь
Posts: 72
|
|
Re: import procedure с аргументами
« Reply #2 on: 15 March 2009, 18:30:08 » |
|
Магия продолжается... Один скрипт экспортирует функцию export procedure p( variable a );
procedure p( variable a ) begin return a+10; end
В другом скрипте эта процедура импортируется import procedure p( variable a );
procedure talk_p_proc begin variable a; a := p("text"); end
В таком виде при попытке вызвать talk_p_proc фол крашится. НО! В следующем варианте все прекрасно работает import procedure p( variable a );
procedure talk_p_proc begin variable a; display_msg(""); //добавлено a := p("text"); end
Магия, да и только... может display_msg как-то специфически модифицирует стек... Попытаюсь найти что же еще можно вставить вместо display_msg("");...
|
|
|
|
Alchemist
Модератор
Posts: 117
Ортодоксальный Сектант
|
|
Re: import procedure с аргументами
« Reply #3 on: 15 March 2009, 19:48:50 » |
|
может display_msg как-то специфически модифицирует стек... Разбери скомпилированный скрипт при помощи int2ssl в дамп (ключик -d), да посмотри, что там с опкодами. Ещё наткнёшся на то, что экспорты и импорты работают только в пределах одного контекста скриптовой машины. И что, экспортирующий скрипт должен быть явно загружен в память и проинициализирован обязательно перед загрузкой импортирующего скрипта. То есть просто сделать импорт процедуры из произвольного скрипта в произвольный скрипт не выйдет. Также есть подозрение, что с параметрами экспортируемой процедуры может быть та же ситуация, что и с GVAR'ами. В смысле, значение может передваваться только числовое. А вобще, если данный вопрос представляет для тебя интерес, не академичсекий, а практический, построй свой скрипт так, чтобы обойтись без экспорта процедур вообще.
|
//Это добром не кончится...
|
|
|
KLIMaka
Пользователь
Posts: 72
|
|
Re: import procedure с аргументами
« Reply #4 on: 15 March 2009, 20:17:56 » |
|
Дело в том, что я уже на опкоды поглядел, и ничего сверхъестественного не обнаружил. Что экспортируемые, что внутренние функции вызываются аналогичным образом. Вид поведения, как я понимаю, уже движком выбирается, по значениям из таблицы процедур. Т.е. на уровне скрипта никаких различий между передачей аргументов в локальные и не локальные процедуры нет.
И вообще, все это смысл теряет на фоне того, что импорт все же работает, но при условии предварения вызова нелокальной процедуры вызовом display_msg(). Может местные двиглоковырятели чего-нибудь знают об поведении этой процедуры? А я пока буду пробовать другие варианты вызовов... Может не только display_msg() такое влияние оказывает.
Интерес пока академический. Т.е. я просто ищу возможности вызывать нелокальные процедуры. Варианты конечно есть - таймерные события, именованные события, но все они не могут принимать аргументов (( Извращался с таймерными событиями, аргументы в которые будут передаваться через импортируемые переменные. Этот подход работает, но в случае одновременного доступа к одному объекту из НЕСКОЛЬКИХ объектов возникают проблемы. Конечно можно реализовать некую минимальную синхронизацию (типа лочить обьект до того момента, пока он не обработает текущий запрос ), но тогда становится проблема обработки отказов доступа. Вот такие вот пироги...
|
|
|
|
Wasteland Ghost
Администратор
Posts: 869
Маленькое Злое Привидение
|
|
Re: import procedure с аргументами
« Reply #5 on: 15 March 2009, 21:09:28 » |
|
Как-то для целей взаимодействия NPC делала «импортные» процедуры, имитирующие вызов обработчика. Сейчас уже мало что помню на эту тему, но хорошо помню, что работали у меня процедуры только с одним параметром (ну или без параметров). С двумя и более просто не срабатывали. Фол не падал (US 1.02d).
|
|
|
|
KLIMaka
Пользователь
Posts: 72
|
|
Re: import procedure с аргументами
« Reply #6 on: 15 March 2009, 21:32:47 » |
|
Тоже US 1.02d (насколько помню...) Интересно что с 2я аргументами работает. Больше - падает даже с display_msg(). Если же кол-во аргументов у экспортируемой и импортируемой процедур не совпадает, то без всяких падений просто не срабатывает.
|
|
« Last Edit: 15 March 2009, 21:45:16 by KLIMaka »
|
|
|
|
|
KLIMaka
Пользователь
Posts: 72
|
|
Re: import procedure с аргументами
« Reply #7 on: 21 March 2009, 22:45:50 » |
|
Интерес всетаки дотащил меня до изучения движка... Мдя, оказалось, что проблема в банальной ошибке - доступ через не инициализированный указатель. При вызове нелокальной процедуры аргументы из стека вызывающего скрипта копируются в стек вызываемого через временный стек. Так вот указатель на этот временный стек программисты не удосужились проинициализировать. display_msg() помогал только тем, что оставлял в сегменте стека какой-то мусор, которым, по случайности инициализировался указатель на временный стек. Ну я чуток подфиксил экзешник, чтобы временный стек создавался в сегменте стека, и все заработало! Потом я еще чуток подфиксил, чтобы постоянно не выскакивали отладочные сообщения о том, что нельзя иметь внешние процедуры с параметрами (наглая ложь! очень даже можно! ), и исправил слет скрипта при повторном экспорте уже существующей процедуры. Вот фиксы:
Исправление проблем с временным стеком 5В75А : 89 АС 24 28 01 00 00 -> 89 60 1С 90 90 90 90
Отключение предупреждений 5DFF1 : 74 -> EB 5E1C4 : 74 -> EB
предотвращение слета при повторном экспорте 319СС : 01 -> 00
|
|
|
|
Jordan
Пользователь
Posts: 416
|
|
Re: import procedure с аргументами
« Reply #8 on: 21 March 2009, 23:55:43 » |
|
KLIMaka Отлично. Я написал Timeslip'у автору sfall'a, что бы он внес эти изменения в sfall. Я указал что автор этого исправления ты. http://www.nma-fallout.com/forum/viewtopic.php?p=652958#652958
|
Воспрянет Россия, из праха отцов Расправятся крылья, миллионов сердец Поднимут все головы и грудью вздохнут И громка скажут, что пришли Мы пришли, со столетней войны
|
|
|
|