1

Тема: AHK: Обращение к двумерным массивам

Доброго времени суток! Сегодня столкнулся с такой проблемой - не могу получить имя строки массива (или подмассива) в двумерном массиве. Помогите разобраться. Допустим, есть двумерный массив, заданный следующим образом:

blank1		:=	[1268, 345, 0]
blank2		:=	[1360, 345, 0]
blank3		:=	[1452, 345, 0]
blank4		:=	[1268, 415, 0]
blank5		:=	[1360, 415, 0]
blank6		:=	[1452, 415, 0]
blanks	:= [blank1, blank2, blank3, blank4, blank5, blank6]

Когда нужно обратиться к ячейке массива, прописываю

MsgBox % blanks[4][1]

И нет никаких проблем.  Сегодня же понадобилось получить имя подмассива blanks, пробовал следующие варианты:

MsgBox % blanks[4]
MsgBox % blanks.4
MsgBox % blanks[4].Name
MsgBox % blanks.4.Name
MsgBox % blanks[4].Name()
MsgBox % blanks.4.Name()

И несколько других.. В результате, получить имя подмассива так и не получилось. Он упорно воспринимает blanks[4] как массив и не желает выдавать его имя.

+ открыть спойлер

Оффтоп: ранее также пытался использовать ячейки массива для координат gui-объектов.. Долго провозился, в итоге методом тыка нашёл рабочий вариант:

Loop % blanks.MaxIndex()
	Gui, Add	, Picture	, % "x"blanks[A_Index][1] ", y"blanks[A_Index][2] ", w"Wpic ", h"Hpic			, pictures\Items\Blank.png

что достаточно странно, т.к. обычно между x, y, w и h не требуются запятые..Но без них он упорно воспринимал только первую координату (в данном куске кода - x).. Если где-либо более подробная информация о синтаксисе ahk при работе с массивами? В справке расписано всё достаточно скудно.

2 (изменено: serzh82saratov, 2017-02-14 20:43:15)

Re: AHK: Обращение к двумерным массивам

floppy пишет:

понадобилось получить имя подмассива blanks

В этом (таком) массиве нет имён ключей, только индексы.
Если только так:

blank1 :=	[1268, 345, 0, "blank1"]
blanks := [blank1]
MsgBox % blanks[1][4]
floppy пишет:

обычно между x, y, w и h не требуются запятые

Так должно работать

% "x" blanks[A_Index][1] " y" blanks[A_Index][2] " w" Wpic " h" Hpic
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

3 (изменено: floppy, 2017-02-14 20:57:07)

Re: AHK: Обращение к двумерным массивам

serzh82saratov, огромное спасибо за решение! Всё оказалось действительно просто. Но всё-таки интересно, возможно ли получить имя массива, а не содержание? Поискал на форуме "получение имени переменной" - также предлагают вносить её в массив со списком переменных, иначе имя переменной получить нельзя.. В каком же виде хранится имя переменной (или подмассива), что к нему нет доступа? Только в виде адреса?

4 (изменено: serzh82saratov, 2017-02-14 21:23:25)

Re: AHK: Обращение к двумерным массивам

В данном случае просто в виде содержания этой переменной, её имя не имеет никакого значения.
Есть другой тип массивов:

blanks := {blank1:[1268, 345, 0]}
MsgBox % blanks["blank1"][1]

Но тут к ключу по индексу, не обратишься.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

5

Re: AHK: Обращение к двумерным массивам

floppy пишет:

В каком же виде хранится имя переменной (или подмассива), что к нему нет доступа?

Хранится в памяти процесса в текстовом виде, доступ есть, но адрес, по которому его считывать, неизвестен.

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

6 (изменено: stealzy, 2017-02-14 22:13:39)

Re: AHK: Обращение к двумерным массивам

b	:= [1268, 415, 0], b.name := "Lol, ti snachala imya zaday, a patom schitivay"
MsgBox % b.name "`n" b[2]

7

Re: AHK: Обращение к двумерным массивам

С переменными можно так получить все названия, после чего парсить.
А с объектами так просто не получается.
Возможно надо смотеть, что записано по полученному адресу в процессе:

a := "test"
b := ["test"]
MsgBox % ScriptInfo("ListVars")

ScriptInfo(Command)
{
    static hEdit := 0, pfn, bkp
    if !hEdit {
        hEdit := DllCall("GetWindow", "ptr", A_ScriptHwnd, "uint", 5, "ptr")
        user32 := DllCall("GetModuleHandle", "str", "user32.dll", "ptr")
        pfn := [], bkp := []
        for i, fn in ["SetForegroundWindow", "ShowWindow"] {
            pfn[i] := DllCall("GetProcAddress", "ptr", user32, "astr", fn, "ptr")
            DllCall("VirtualProtect", "ptr", pfn[i], "ptr", 8, "uint", 0x40, "uint*", 0)
            bkp[i] := NumGet(pfn[i], 0, "int64")
        }
    }
 
    if (A_PtrSize=8) {  ; Disable SetForegroundWindow and ShowWindow.
        NumPut(0x0000C300000001B8, pfn[1], 0, "int64")  ; return TRUE
        NumPut(0x0000C300000001B8, pfn[2], 0, "int64")  ; return TRUE
    } else {
        NumPut(0x0004C200000001B8, pfn[1], 0, "int64")  ; return TRUE
        NumPut(0x0008C200000001B8, pfn[2], 0, "int64")  ; return TRUE
    }
 
    static cmds := {ListLines:65406, ListVars:65407, ListHotkeys:65408, KeyHistory:65409}
    cmds[Command] ? DllCall("SendMessage", "ptr", A_ScriptHwnd, "uint", 0x111, "ptr", cmds[Command], "ptr", 0) : 0
 
    NumPut(bkp[1], pfn[1], 0, "int64")  ; Enable SetForegroundWindow.
    NumPut(bkp[2], pfn[2], 0, "int64")  ; Enable ShowWindow.
 
    ControlGetText, text,, ahk_id %hEdit%
    return text
}