Выполняемый модуль глючит?

Автор alyuev, 03 декабря 2024, 01:15

« назад - далее »

alyuev

Граждане, кто-то может объяснить, почему параметры функции возвращают какую-то лабуду при вызове через переменную ВполняемыйМодуль?

ВыполняемыйМодуль = "";
Текст_Модуля="Функция НашаФормула(П1=1, П2=2, П3=3)
|		Сообщить(""НашаФормула(П1=""+П1+"" П2=""+П2+"" П3=""+П3+"")"");
|КонецФункции";
ВыполняемыйМодуль=СоздатьОбъект("ВыполняемыйМодуль");
ВыполняемыйМодуль.УстановитьМодуль(Текст_Модуля);
ВыполняемыйМодуль.НазначитьКонтекст(Контекст);
ВыполняемыйМодуль.КомпилироватьИВыполнитьМодуль();


ВыполняемыйМодуль.НашаФормула();     //выдало НашаФормула(П1= П2=1 П3=2), ожидалось П1=1 П2=2 П3=3
ВыполняемыйМодуль.НашаФормула(10);   //выдало НашаФормула(П1=10 П2= П3=2), ожидалось П1=10 П2=2 П3=3
ВыполняемыйМодуль.НашаФормула(10,20);//выдало НашаФормула(П1=10 П2=20 П3=), ожидалось П1=10 П2=20 П3=3
ВыполняемыйМодуль.НашаФормула(10,,30);//выдало НашаФормула(П1=10 П2= П3=30), ожидалось П1=10 П2=2 П3=30

Обратите внимание - первый непередаваемый параметр = Пусто, а остальные - смещаются!
И почему не подставилось по-умолчанию?


Djelf

Это не реализовано в ExecuteModule.cpp CExecuteModule::GetParamDefValue
В лучшем случае п1,п2,п3 равны порядковому номеру параметра, в худшем там все перепутано.

alyuev

О... Да... Немного изменил тест и теперь видно, что ставит порядковый номер:

ВыполняемыйМодуль = "";//СпФормул.Получить(Формула);
	Текст_Модуля="Функция НашаФормула(П1=11, П2=22, П3=33)
	|		Сообщить(""НашаФормула(П1=""+П1+"" П2=""+П2+"" П3=""+П3+"")"");
	|КонецФункции";
ВыполняемыйМодуль=СоздатьОбъект("ВыполняемыйМодуль");
ВыполняемыйМодуль.УстановитьМодуль(Текст_Модуля);
ВыполняемыйМодуль.НазначитьКонтекст(Контекст);
ВыполняемыйМодуль.КомпилироватьИВыполнитьМодуль();

ВыполняемыйМодуль.НашаФормула();	  //НашаФормула(П1= П2=1 П3=2)  , ожидалось П1=11 П2=22 П3=33
ВыполняемыйМодуль.НашаФормула(10);    //НашаФормула(П1=10 П2= П3=2) , ожидалось П1=10 П2=22 П3=33
ВыполняемыйМодуль.НашаФормула(10,20); //НашаФормула(П1=10 П2=20 П3=), ожидалось П1=10 П2=20 П3=33
ВыполняемыйМодуль.НашаФормула(10,,30);//НашаФормула(П1=10 П2= П3=30), ожидалось П1=10 П2=22 П3=30

Djelf

Собрать то 1с++ я могу, но я не понимаю как получить значение в контексте функции/процедуры.
Вроде их получают через pModule->EvalExpr(VarInfo.GetName(), val, &masval), masval - штука непонятная, а  val это то что нам нужно. Но вызов этого метода убивает все переменные в функции...
Я этого не понимаю  ;D

ИМХО: Забей на эту тему, лет 15 назад ее надо было поднимать, когда те кто знал и понимал, были еще активны.

Передавай как в снеговике: ПолучитьПараметрыВызоваЧегоТо(), ВызватьЧтоТо(ПараметрыВызова).
Не так лаконично, но и плюсов довольно много.

alyuev

Сейчас-то, конечно, вопрос закрыт - просто указанием в вызове функции всех параметров.

 А на счет этого:
Цитата: Djelf от 03 декабря 2024, 14:44Передавай как в снеговике: ПолучитьПараметрыВызоваЧегоТо(), ВызватьЧтоТо(ПараметрыВызова)

если честно - не понял про что речь. Передавать параметры списком?


АЛьФ

С получением значений по умолчанию для функций и процедур в 1С полный мрак. Пытался с этим вопросом разбираться. Вроде как получилось, но уж очень кривой код получается. Функций экспортных нет для получения нужного, приходится через свойства объектов шагать. А это очень ненадежно.

Djelf

АЛьФ, у тебя же компилятор есть, вроде как-то ты мне давал точку входа для исследований...
Что и где там по факту вызывается перед CallAsFunc,  CallAsProc?

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

Не помню, с Классами была такая проблема? Решили?

Djelf

Цитата: alyuev от 03 декабря 2024, 17:58если честно - не понял про что речь. Передавать параметры списком?
Чем угодно - тз, сз, итз, вектором... Времена изменились, за каждый тик процессора особенно бороться не требуется.

АЛьФ

Цитата: Djelf от Вчера в 14:37АЛьФ, у тебя же компилятор есть, вроде как-то ты мне давал точку входа для исследований...
Что и где там по факту вызывается перед CallAsFunc,  CallAsProc?

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

Не помню, с Классами была такая проблема? Решили?

В FormEx Артур вынес получение значений по умолчанию в отдельную процедуру:
void CService::GetModuleMethodParamDefValue( CBLModule * pMod, int iMethodNumber, int iParamNumber, CValue& value)
{
	CCompiledModule* pCompiledModule = pMod->GetInternalData()->pCompiledModule;
	CBLModuleProcVarDescr* pVar = pCompiledModule->ProcArray[iMethodNumber]->VarList[iParamNumber];
	if(pVar->Type2 >= 0)
		value = pCompiledModule->ConstArray[pVar->Type2]->val;
	else
		value.Reset();
}
Но это очень ненадежный метод, т.к. никаких проверок на корректность ссылок там нет.