1 (изменено: yalanne, 2015-03-18 18:08:57)

Тема: AHK: Перевод из string в integer

Как можно сделать перевод из str

q := "1 + 1 *2"

в int, что бы соблюдались арифметические действия, то есть что бы q было равно 3?

2

Re: AHK: Перевод из string в integer

yalanne, ознакомьтесь с этой темой, отредактируйте свой пост.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: Перевод из string в integer

q:=%q%  ?

4

Re: AHK: Перевод из string в integer

Foma, сам-то запускал?

Нужно или самостоятельно парсить строку (наверное, есть библиотеки для Eval()), или воспользоваться таким вариантом от teadrinker'а.

oSC := ComObjCreate("ScriptControl"),oSC.Language := "VBScript"
q := "1 + 1 * 2"
MsgBox % oSC.Eval(q)

5

Re: AHK: Перевод из string в integer

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?

6

Re: AHK: Перевод из string в integer

Сравни приведенный мной пример со своим сообщением и найди отличия.

7

Re: AHK: Перевод из string в integer

Господа, на будущее, сначала выполнение требований модератора, затем помощь. В следующий раз буду удалять сообщения без предупреждений.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

8

Re: AHK: Перевод из string в integer

Собственно, замечание было относительно оформления темы, если не ошибаюсь. Если взглянуть на хронологию постов, сначала ТС исправился, затем стали отписываться участники. В чем я неправ?

9

Re: AHK: Перевод из string в integer

Посты очень желательно начинать с большой буквы, как и предложения.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

10

Re: AHK: Перевод из string в integer

teadrinker, Исправил.
Irbis, Погуглив я понял что эта ошибка из за того что у меня стоит 64x бит windows.

11

Re: AHK: Перевод из string в integer

yalanne, дело в версии Autohotkey. На 32-разрядной версии скрипт работает под Win7 x64.

12

Re: AHK: Перевод из string в integer

Объект ScriptControl существует только в 32-битной версии. На форуме уже обсуждались другие варианты.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

13

Re: AHK: Перевод из string в integer

Я вот такой вариант сделал:

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

14

Re: AHK: Перевод из string в integer

Нет, я имел в виду объект с возможностью использовать другой скриптовый язык с функцией Eval(), например этот вариант.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

15

Re: AHK: Перевод из string в integer

Этот вариант тоже выдает ошибку: 0х800С0005 - Не удается найти указанный ресурс.
если что у меня Windows 10 Technical Preview может из за этого не работает.

16

Re: AHK: Перевод из string в integer

Файл 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")

17 (изменено: Irbis, 2015-03-19 00:44:38)

Re: AHK: Перевод из string в integer

Непонятно, но работает.

/*<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)
}

18

Re: AHK: Перевод из string в integer

Если кто не заметил, в документации есть такой пример:
http://ahkscript.org/docs/commands/Run.htm#ExecScript.
Я бы в нём исправил строку

    exec := shell.Exec("AutoHotkey.exe /ErrorStdOut *")

на

    exec := shell.Exec(A_AhkPath . " /ErrorStdOut *")

хотя не знаю, как быть с откомпилированными скриптами, если нет отдельного AutoHotkey.exe.
----------------------------------------

Irbis пишет:

Файл 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")

19

Re: AHK: Перевод из string в integer

wisgest пишет:

Если кто не заметил, в документации есть такой пример

Заметили, но это запуск кода отдельным процессом, в отличие от предыдущего примера.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

20

Re: AHK: Перевод из string в integer

wisgest пишет:

Если кто не заметил, в документации есть такой пример:
http://ahkscript.org/docs/commands/Run.htm#ExecScript.
Я бы в нём исправил строку

    exec := shell.Exec("AutoHotkey.exe /ErrorStdOut *")

на

    exec := shell.Exec(A_AhkPath . " /ErrorStdOut *")

Спасибо, вроде как мне подходит.