1 (изменено: Indomito, 2013-10-29 10:56:18)

Тема: AHK: Ассоциативные массивы

Так мой скрипт превысил размеры для не предикатных(не декларируемых) языков программирования и всё началось путаться, я решил обратить внимание к объектам и начал с Associative Arrays

Вопрос №1
Как описать массив многомерным, хотя бы 2-х? На все мои сочетания различных символов { [ , .  - я услышал такие ругательства, которые AHK мне ни разу не говорил

Вопрос №2
В описании (CHM-справка), я прочитал - For example, {(KeyVar): Value} and {GetKey(): Value} are both valid. - попытался повторить и конечно ничего не вышло, написал функцию, ну и на всякий случай попробовал ещё раз - опять ругательство.
Как же написать то верно?
К функциям я обратился из-за того что, не нашёл индексирования ассоциативных массивов, обычно можно писать так Main.MainPartOne.Next(i).MainPartTwo.Last(j) для версии двух мерного массива/объекта Main или же ещё проще Main.MainPartOne(i).MainPartTwo(j), а ещё можно делать индексацию от ключа.

Вопрос №3
В поисках "присобачит" к объекту функцию, которая как то сможет повлиять на него, я наткнулся на пример из области Prototypes, т.е.  конструкторов или же методов, уже началась путаница с обычной терминологией для ООП (Object-oriented programming)

; Create an object.
object.thing := {}
; Store a value.
thing.foo := "bar"
; Create a method by storing a function reference.
thing.test := Func("thing_test")
; Call the method.
thing.test()
thing_test(this) {
MsgBox % this.foo}

этот код работает, но работает без параметрической связки, т.е. реализовать наследование или передать текущее значение объекта  другому объекту не удаётся, как и поменять значения родителя, т.е. объекта к которому функция привязана, я про допустимые изменения в рамках наследования.

Лезть в классы не хочется, уже страшновато как то становится.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

2 (изменено: Indomito, 2013-10-29 12:37:51)

Re: AHK: Ассоциативные массивы

C вопросом №1 вроде разобрался это ведь 2-х мерный массив/объект?

Test := {main:{KeyA: 1, KeyB: 2, Key3: 3}, sasa:{KeyA: 10, KeyB: 20, Key3: 30}, tata:{KeyA: 100, KeyB: 200, Key3: 300}}

Верно? Или 3-х? Я блин уже запутался

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

3

Re: AHK: Ассоциативные массивы

Насколько понял, каждый элемент массива в свою очередь массив? 1 + 1 = 2.

4 (изменено: Indomito, 2013-10-29 13:24:21)

Re: AHK: Ассоциативные массивы

Так значит должно быть так

Test := {sasa:{KeyA: 1, KeyB: 2, Key3: 3}, tata:{KeyA: 10, KeyB: 20, Key3: 30}}

Для массива обычного это будет

Array := [[1,2,3],[10,20,30]]

Так? Похоже так.

Теперь про обращение

1. Array[1,1] это  будет 1. Что писать для ассоциативного массива?
Сижу и перебираю варианты - ничего пока не выдаёт

2. Индексация, самое непонятное, в справке я не нашёл или пропустил информацию
Обычный массив Array[i,j], как записывать для ассоциативного массива?

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

5

Re: AHK: Ассоциативные массивы

Если правильно понял вопрос, то так, наверно:

Test := {sasa:{KeyA: 1, KeyB: 2, Key3: 3}, tata:{KeyA: 10, KeyB: 20, Key3: 30}}

MsgBox, % Test.sasa.KeyB

6

Re: AHK: Ассоциативные массивы

YMP пишет:

то так, наверно:...

да верно эту комбинацию я ещё не проверил

А как индексироваться, просто не удобно постоянно писать константные имена. Я попытался воспользоваться встроенным методом MinIndex/MaxIndex и не получается хотя в справке написано -  result := obj.Method(params)

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

7

Re: AHK: Ассоциативные массивы

Кстати, работают только в таком варианте

Test := {1: 10, 2: 20, 3: 30}
sasa:=test.MinIndex()
msgbox, %sasa% 
exit

т.е. ключ должен быть целым числом, а иначе возвращается false

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

8

Re: AHK: Ассоциативные массивы

Indomito пишет:

А как индексироваться, просто не удобно постоянно писать константные имена.

Почему тогда простые массивы не использовать?

9

Re: AHK: Ассоциативные массивы

MsgBox, % Test.sasa.KeyB

Ещё можно так:

MsgBox %  Test.sasa["KeyB"]

А как индексироваться, просто не удобно постоянно писать константные имена

И зачем тогда вообще использовать ассоциативный массив в таком случае?


Array := [[1,2,3],[10,20,30,40]]
MsgBox % Array.1.MaxIndex()
MsgBox % Array.2.MaxIndex()
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

10 (изменено: Indomito, 2013-10-29 14:43:32)

Re: AHK: Ассоциативные массивы

serzh82saratov пишет:

И зачем тогда вообще использовать ассоциативный массив в таком случае?

в таком варианте проще писать Array[i,j ]

Ассоциативный массив хорош тем, что понятно, что получаешь, т.е. элементы объекта поименованы.
Меня утомило сочинять конструкции типа:

NetName :=1, NetDHCP :=2, NetIP :=3, NetGate :=4, NetState:=5, NetST:=1, FindKey :=2
Internet := [["","интерфейса"], ["" ,"включен:"], ["" ,"IP-адрес"], ["" ,"шлюз:"], [false,false]]

Хотя индексы можно записать так

Internet := {NetName:1, NetDHCP:2, NetIP:3, NetGate:4, NetState:5, NetST:1, FindKey :2}

но и к индексам надо применять операции "++" и "--"...
Мне просто не понятен смысл ассоциативных массивов в реализации AHK, почему операции только для целочисленных ключей, а изобразить простую функцию возврата значения объекта со смещением, я даже не знаю как сделать. Я про одну функцию - универсальную.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

11 (изменено: serzh82saratov, 2013-10-29 15:05:05)

Re: AHK: Ассоциативные массивы

в таком варианте проще писать Array[i,j ]

Не понял.
---
Если ты хочешь просто видеть глядя на массив в блокноте, что значит значение, можешь сделать так:


Array := [["любое имя ключа: 11","любое имя ключа: 22","любое имя ключа: 33"]
    ,["любое имя ключа: 111","любое имя ключа: 222","любое имя ключа: 333","любое имя ключа: 444"]]
 
Loop % Array.1.MaxIndex()
    MsgBox % RegExReplace(Array.1[A_Index], ".*?: ")
Loop % Array.2.MaxIndex()
    MsgBox % RegExReplace(Array.2[A_Index], ".*?: ")

---
Так понимаю что про цикл разбора массивов, вы знаете?:

Test := {sasa:{KeyA: 1, KeyB: 2, Key3: 3}, tata:{KeyA: 10, KeyB: 20, Key3: 30}}

For Key, Value in Test.tata
    MsgBox, % Key " = " Value

Уточняю, потому как не пойму чего именно требуется добится.

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

12

Re: AHK: Ассоциативные массивы

serzh82saratov пишет:

Уточняю, потому как не пойму чего именно требуется добится.

я хочу индексироваться от конкретного именованного ключа, так проще мне, т.к. это более наглядно, да и не надо делать кучу константных переменных, просто я должен просмотреть пару файлов скрипта и найти эту константу.

Да циrл оно хорошо, хотелось бы запись попроще, вида:

if (Test1.keyAs=(Test2.(KeyZero+1)) 
    { ..... }
  else  { ..... }
"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

13

Re: AHK: Ассоциативные массивы

Да циrл оно хорошо, хотелось бы запись попроще, вида:

Цикл не хорошо, он не даёт "правильного" индекса.

я хочу индексироваться от конкретного именованного ключа, так проще мне, т.к. это более наглядно

Если имена ключей, тогда проиндексируй их в отдельный массив.

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

14

Re: AHK: Ассоциативные массивы

serzh82saratov пишет:

Если имена ключей, тогда проиндексируй их в отдельный массив.

а может просто создать метод для объекта?
Я бы создал, но не получается, т.е. что то получается, но не то что мне нужно.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

15

Re: AHK: Ассоциативные массивы

Indomito пишет:

1. Array[1,1] это  будет 1. Что писать для ассоциативного массива?

Test := {sasa:{KeyA: 1, KeyB: 2, Key3: 3}, tata:{KeyA: 10, KeyB: 20, Key3: 30}}
MsgBox % Test.sasa.KeyA
MsgBox % Test["sasa"]["KeyA"]
MsgBox % Test["sasa", "KeyA"]
MsgBox % Test["sasa"].KeyA
MsgBox % Test.sasa["KeyA"]
Забыл пароль и потерял e-mail.

16

Re: AHK: Ассоциативные массивы

Да, я с этим разобрался, проблема в индексации от ключа, вот я про что

Массив:

 i:=3 
array[a,b+i]

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

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

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

17

Re: AHK: Ассоциативные массивы

serzh82saratov пишет:

я хочу индексироваться от конкретного именованного ключа, так проще мне, т.к. это более наглядно

Если имена ключей, тогда проиндексируй их в отдельный массив.

а можно простой пример, просто я уже запутался, что куда от чего и как индексировать

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

18 (изменено: Indomito, 2013-11-05 15:01:52)

Re: AHK: Ассоциативные массивы

И ещё, как обратиться к такому массиву-объекту -

Test := [[10, 20, 30], {KeyA: 1, KeyB: 2, Key3: 3}]
"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

19 (изменено: shnec, 2015-04-24 00:15:22)

Re: AHK: Ассоциативные массивы

Подскажите пожалуйста (и примером тоже), как в такой массив вставлять данные через insert .

Arr := {1205:{1: 444444, 2: 2}, 205:{1: 777777, 2: 0}, 608:{1: 22222, 2: 1}}

20

Re: AHK: Ассоциативные массивы

shnec, оформите код, как положено.

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

21

Re: AHK: Ассоциативные массивы

Исправил, сори.

22

Re: AHK: Ассоциативные массивы

Для начала изучите синтаксис. Попробуйте запустить код с таким объектом.

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

23 (изменено: shnec, 2015-04-24 00:25:24)

Re: AHK: Ассоциативные массивы

Упс, поправил. так работает.

MsgBox, % Arr.1205.1

выводит 444444

Arr := {1205: [444444, 2], 205: [777777,  0], 608: [22222, 1]}

Или в такой объект, помогите разобраться как через Insert вставлять данные.

24

Re: AHK: Ассоциативные массивы

А это у вас массив с какими-то конкретными данными, или просто из головы? Дело в том, что хоть и работает, в таком виде обычно всё это не пишется. Если массив ассоциативный (т. е. вида {ключ: "значение"}), тогда ключ обычно это строка, а не число. Если это линейный массив (просто перечисление значений), тогда он оформляется в виде

["раз", "два", "три", 345, 678, 123]

Поэтому непонятна изначальная идея составления массива и цель вставки чего-либо. Поэтому лучше рассматривать на конкретном примере, где ясно, как массив образуется.

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

25 (изменено: shnec, 2015-04-24 00:41:29)

Re: AHK: Ассоциативные массивы

В принципе реальный массив.
К примеру:
1205      - pID процесса
444444  - последнее процессорное время этого процесса (уже суммированное)
2            - некая величина, которую я переписываю относительно времени процессора

Мне получается удобно в таком виде писать и считывать значения, можно как то ухитрится в такой массив их записывать?

26

Re: AHK: Ассоциативные массивы

Тогда если нужно вставить данные нового процесса, тогда просто:

Arr := {1205: [444444, 2], 205: [777777,  0], 608: [22222, 1]}
Arr.1234 := [1111, 222]
MsgBox, % Arr.1234.1

Хотя понятнее это было бы оформить так:

Arr := [{PID: 1205, Time: 444444, Data: 2}, {PID: 2435, Time: 333333, Data: 5}]
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

27

Re: AHK: Ассоциативные массивы

MsgBox, % Arr.1.Time
444444
 

Да, ваш вариант действительно удобней, только вопрос тот же, а как в него вставлять новые данные?

28

Re: AHK: Ассоциативные массивы

У нас получился линейный массив ассоциативных массивов, поэтому есть разница, куда вставлять: в начало, под каким-то индексом или в конец. Если в конец, то так:

Arr := [{PID: 1205, Time: 444444, Data: 2}, {PID: 2435, Time: 333333, Data: 5}]
Arr.Push({PID: 1234, Time: 1111, Data: 222})
MsgBox, % Arr[3].PID
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

29

Re: AHK: Ассоциативные массивы

Спасибо огромное!