Тема: AHK: Перевод из string в integer
Как можно сделать перевод из str
q := "1 + 1 *2"в int, что бы соблюдались арифметические действия, то есть что бы q было равно 3?
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Как можно сделать перевод из str
q := "1 + 1 *2"в int, что бы соблюдались арифметические действия, то есть что бы q было равно 3?
yalanne, ознакомьтесь с этой темой, отредактируйте свой пост.
q:=%q% ?
Foma, сам-то запускал?
Нужно или самостоятельно парсить строку (наверное, есть библиотеки для Eval()), или воспользоваться таким вариантом от teadrinker'а.
oSC := ComObjCreate("ScriptControl"),oSC.Language := "VBScript"
q := "1 + 1 * 2"
MsgBox % oSC.Eval(q)Irbis, Ошибка:
Error: 0x80040154- Класс не зарегистрирован Line#
—> 001: oSC := ComObjCreate("ScriptContror),oSC.Language
"VBScript"
002: q:= "1 + 1*2"
003: MsgBox,oSC.Eval(q)
004: Exit 005: Exit 005: Exit
Continue running the script?Сравни приведенный мной пример со своим сообщением и найди отличия.
Господа, на будущее, сначала выполнение требований модератора, затем помощь. В следующий раз буду удалять сообщения без предупреждений.
Собственно, замечание было относительно оформления темы, если не ошибаюсь. Если взглянуть на хронологию постов, сначала ТС исправился, затем стали отписываться участники. В чем я неправ?
Посты очень желательно начинать с большой буквы, как и предложения.
teadrinker, Исправил.
Irbis, Погуглив я понял что эта ошибка из за того что у меня стоит 64x бит windows.
yalanne, дело в версии Autohotkey. На 32-разрядной версии скрипт работает под Win7 x64.
Объект ScriptControl существует только в 32-битной версии. На форуме уже обсуждались другие варианты.
Я вот такой вариант сделал:
q := "5+5-2"
w_calc:
if ((((wexp:="") (w1:="") (w2:="") (wloop:=0)) ? "" : "") ((((wexp := RegExMatch(q, "[\+|\-|\*|\/]","",(RegExMatch(q, "[\+|\-|\*|\/]","") + 1))) ? ((wloop:=1) (wexp:=substr(q,1,wexp-1))) : (wexp:=q)) ? "" :)) (((RegExMatch(wexp, "(.*)[\+|\-|\*|\/]",w1) ? "" : "" ) (RegExMatch(wexp, "[\+|\-|\*|\/]",w) ? "" : "" ) (RegExMatch(wexp, "[\+|\-|\*|\/](.*)",w2)) (w1:=substr(w1,1,-1)) (w2:=substr(w2,2,strlen(w2)-1))) ? "" : "") ((q:=(((w="+") ? w1 + w2 : (w="-") ? w1 - w2 : (w="*") ? w1 * w2 : w1 // w2) substr(q,strlen(wexp)+1,strlen(q)-strlen(wexp)+1))) ? "" : "")) wloop
goto w_calc
msgbox % qминус его только то в том, что игнорируется математические правила, то есть высчитывает все по порядку.
например
1+1*2будет как 1) 1+1=2 2)2*2=4
Нет, я имел в виду объект с возможностью использовать другой скриптовый язык с функцией Eval(), например этот вариант.
Файл JS.wsc создан?
Вот бы обойтись без промежуточного файла...
ScriptletURL := A_ScriptDir . "\JS.wsc"
if !FileExist(ScriptletURL)
FileAppend,
(
<component>
<public><method name='eval'/></public>
<script language='JScript'></script>
</component>
), %ScriptletURL%
JS := ComObjGet("script:" . ScriptletURL)
MsgBox % JS.eval("1 + 1 * 2")
Непонятно, но работает.
/*<component>
<public><method name='eval'/></public>
<script language='JScript'></script>
</component>
*/ JS := ComObjGet("script:" . A_ScriptFullPath)
loop 4 {
q := A_Index "*" A_Index "-" 1
MsgBox % q " = " JS.eval(q)
}Если кто не заметил, в документации есть такой пример:
http://ahkscript.org/docs/commands/Run.htm#ExecScript.
Я бы в нём исправил строку
exec := shell.Exec("AutoHotkey.exe /ErrorStdOut *")на
exec := shell.Exec(A_AhkPath . " /ErrorStdOut *")хотя не знаю, как быть с откомпилированными скриптами, если нет отдельного AutoHotkey.exe.
----------------------------------------
Файл JS.wsc создан?
Вот бы обойтись без промежуточного файла...
У меня работает через формат MHTML:
/*
MIME-Version: 1.0
Content-Type:multipart/related; boundary="BOUNDARY";
--BOUNDARY
Content-Type: text/scriptlet; charset="windows-1251"
Content-Transfer-Encoding: 8bit
Content-Location: JS.wsc
<component>
<public><method name='eval'/></public>
<script language='JScript'></script>
</component>
--BOUNDARY--
*/
ScriptletURL := "mhtml:" . A_ScriptFullPath . "!JS.wsc"
JS := ComObjGet("script:" . ScriptletURL)
MsgBox % JS.eval("1 + 1 * 2")
Если кто не заметил, в документации есть такой пример
Заметили, но это запуск кода отдельным процессом, в отличие от предыдущего примера.
Если кто не заметил, в документации есть такой пример:
http://ahkscript.org/docs/commands/Run.htm#ExecScript.
Я бы в нём исправил строкуexec := shell.Exec("AutoHotkey.exe /ErrorStdOut *")на
exec := shell.Exec(A_AhkPath . " /ErrorStdOut *")
Спасибо, вроде как мне подходит.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться