![]() |
#1 |
Участник
|
Результат арифметического выражения: "2*2" в 4. Как?
В старом, добром Fox'е это решалось очень просто: val = &str
А как это можно сделать в Axapta? Спасибо. |
|
![]() |
#2 |
Участник
|
поищите по runBuf
|
|
![]() |
#3 |
Banned
|
evalbuf('2*2')
|
|
|
За это сообщение автора поблагодарили: e@gle (1), CDan (1). |
![]() |
#4 |
Участник
|
Вот пример из Tabax:
X++: //src = 'AnyType mainFun(Object tabax){return '+_s+";}" void runIt(str _src, boolean _doWrite=true) { XPPCompiler comp=new XPPCompiler(); ; if(comp.compile(_src)) if (_doWrite) this.write(runBuf(_src, element)); else runBuf(_src, element); else info(comp.errorText()); } ![]() |
|
![]() |
#5 |
Участник
|
|
|
![]() |
#6 |
Участник
|
Выяснилось, что при выполнении функции evalBuf с некорректным выражением в качестве аргумента (например, с нечисловыми символами), молча прерывается выполнение текущего класса (формирование отчета, например).
Приведенный ниже пример работает и для некорректных выражений, и для случаев деления на 0: X++: real getResult(str _function) { XPPCompiler comp=new XPPCompiler(); real ret; _function = 'real result(){return ' + _function + ';}'; if(comp.compile(_function)) { try ret = runBuf(_function); catch (Exception::Error) infolog.clear(); } return ret; } |
|
![]() |
#7 |
Banned
|
Да. Только не забывайте про trustworthy computing и возможность code injection. В 4.0 рекомендуется вызывать ExecutePermission.assert():
X++: try { permission = new ExecutePermission(); if (permission == null) return ...; pseudoFunc = "static real func() { return " + expression + "; }"; permission.assert(); if(comp.compile(pseudoFunc)) { result = runBuf(expression); } else { ... } CodeAccessPermission::revertAssert(); } catch (Exception::Error) { ... } |
|