1 (изменено: alexii, 2011-10-27 12:12:03)

Тема: AHK: Как получить строку по адресу?

Функция возвращает ссылку на строку в errorlevel, но Dereference (*) почему-то не работает:

zzz := *errorlevel
msgbox %zzz%

при том numget работает и печатает длинное четырехбайтовое число:

zzz := numget(errorlevel)
msgbox %zzz%

Вопрос в заголовке.

2

Re: AHK: Как получить строку по адресу?

В ahk нет строгой типизации, поэтому переменные там хранятся не так как в "традиционных" языках программирования и такие манипуляции с адресами тут не проходят, это видно из следующего примера:

x := 123
y := *&x
msgbox %x%, %y%

По идее мы должны получить сообщение "123, 123", но получаем другое. Но AHK поддерживает создание "классических" переменных:

VarSetCapacity(x, 4) ; объявляем перенменную x, размером в 4 байта
NumPut(123, x) ; присваиваем ей значение 123
VarSetCapacity(y, 4) ; объявляем перенменную y
NumPut(*&x, y) ; присваиваем ей значение переменной x, по адресу
msgbox % NumGet(x) . ", " . NumGet(y) ;%

В AutoHotkey_L есть так же функции StrGet и StrPut для работы с NULL-terminate строками.

3

Re: AHK: Как получить строку по адресу?

D_Pavel пишет:

Функция возвращает ссылку на строку в errorlevel, но Dereference (*) почему-то не работает:

zzz := *errorlevel
msgbox %zzz%

Таким образом получают один байт, расположенный по указанному адресу, в котором будет код первого символа строки. Сам символ можно получить через функцию Chr(code).
Работает так:

string = это строка

While code := *(&String + A_Index - 1)   ; пока число расположенное по указанному адресу не будет равно 0
   Text .= Chr(code)                     ; читаем код и сдвигаемся на один байт
   
MsgBox, % Text

Ну, или так (в AHK_L):

string = это строка
MsgBox, % StrGet(&string)
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

4

Re: AHK: Как получить строку по адресу?

teadrinker пишет:

Таким образом получают один байт, расположенный по указанному адресу, в котором будет код первого символа строки.

Точно, а я на юникод версии проверял и не заметил закономерности между var и *&var . И приведённый пример, естественно, работает только на ascii. Вот универсальный:

string := "это строка" 
While code := A_IsUnicode ? *(&string + A_Index*2-2)+*(&string + A_Index*2-1)*256 : *(&String + A_Index - 1)
   Text .= Chr(code)
MsgBox %Text%

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

string := "это строка" 
While code := A_IsUnicode ? NumGet(string, (A_Index - 1)*2, "ushort") : NumGet(string, A_Index - 1, "uchar")
   Text .= Chr(code)
MsgBox %Text%

5

Re: AHK: Как получить строку по адресу?

Собственно, вопрос, скорее всего задан не совсем правильно. В errorlevel ссылка не на строку (не на переменную), а просто на число определённой длины в байтах, начинающееся с указанного адреса. Если четырёхбайтное, то через разадресацию можно прочитать так:

VarSetCapacity(Var, 4)
NumPut(4294967290, Var)   ; кладём число по указанному адресу

Loop 4
   Number += (*(&Var + A_Index - 1))<<(8*(A_Index - 1))   ; читаем
   
MsgBox, % Number
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

6

Re: AHK: Как получить строку по адресу?

Вопрос задан правильно. Всем спасибо, разобрался. Установил AutoHotkey_L.