Current time: 20.04.2024, 17:03 Hello There, Guest! (LoginRegister)
Language: english | russian  

Post Reply 
Threaded Mode | Linear Mode
Школа ERM 2
» ERM 2.0 для ERA III
Author Message
Berserker Offline
Administrators

Posts: 16485
Post: #181

Не сохранив ID массива, ты не можешь с ним работать и создаёшь утечку памяти.
Но если тебе нужен массив, который самоудалится по выходу из текущего триггера, то


Quote:Надо ли вообще их удалять?
Временные для триггера — надо. Если нужно передать временный вызывающему коду, а после выполнения кода удадить, то можно продлить время жизни массива через:
!!SN:F^ExtendArrayLifetime^/[ИД];

Если массив имеет тип хранения M_TEMP, то при загрузке он сохраняет свой размер, но теряет данные. Экономится место в сохранёнках.
Если тип хранения M_STORED, то это глобальный массив, который сам никогда не удаляется.

Для удаления глобального массива вызови !!SN:M[ID];
Менять размер массива часто — можно. Он оптимизирован и под капотом выделяем память кратно степени двойки.

Выбрал ты всё верно. Только определись, где ты создаёшь массив и как долго его используешь.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
31.03.2021 16:06
Find all posts by this user Quote this message in a reply
daemon_n Offline
Administrators

Posts: 4338
Post: #182

Berserker, у меня диалог, который подгружает данные при открытия этого диалога.

Изменяю массивы на лету. В зависимости от входящих данных, количество которых зависит уже не от меня96-copy
Массив мне точно нужен временный, если точнее, 3 временных массива. Создавать их надо, видимо, всего один раз: в инструкции.

Quote:Для удаления глобального массива вызови !!SN:M[ID];
Так как мне получить ID массива, если ему присваивается номер автоматически?

Массивы мне нужны в течение всей игры лишь как буфер. Однако их использование (любое изменение/чтение) ограничивается одним диалогом, при закрытии которого я ставлю их размер в 0 элементов


Image: widget.png?style=banner2

Новейший Heroes 3 Launcher
31.03.2021 17:30
Visit this user's website Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16485
Post: #183

?i^dae_texts^ — и есть параметр, куда сохраняется ID массива. Если массив локальный для триггера — то можно в локальную именованную переменную:
?(someList:y)

В общем в функции показа диалога делай так:



Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
31.03.2021 18:44
Find all posts by this user Quote this message in a reply
daemon_n Offline
Administrators

Posts: 4338
Post: #184

Berserker, локальные массивы не подойдут точно.

Странно вот что - у меня массивы не обнулялись через



каждый раз создавался массив с ID ниже:
вот три массива возвращали при создании и удалении с теми же именами.
-1, -2, -3
-4, -5, -6
и тд - каждый раз

Так какая именно команда для получения id?
Всё перепробовал


Image: widget.png?style=banner2

Новейший Heroes 3 Launcher
31.03.2021 19:17
Visit this user's website Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16485
Post: #185

Если массивы нужны только для инициализации, показа диалога и затем очистки, то тебе подходят локальные для триггера.
ID ты получаешь ?i^dae_texts^ здесь.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
31.03.2021 23:41
Find all posts by this user Quote this message in a reply
daemon_n Offline
Administrators

Posts: 4338
Post: #186

Berserker, я же сказал, что не подойдут, так как там хранятся имена строк, которые будут использованы в другом триггере.В целых 3 триггерах:
Имя функции на лкм, текст хинта при наведении, текст на пкм.

Кажется, понял ID. Спасибо
Попробую.


Image: widget.png?style=banner2

Новейший Heroes 3 Launcher
01.04.2021 00:42
Visit this user's website Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16485
Post: #187

Смотри:

Триггер 1:
...
создаём временный массив
....
вызов диалога; 100500 вложенных событий
....
Конец Триггера 1. Только здесь автоудалится временный массив


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
01.04.2021 02:26
Find all posts by this user Quote this message in a reply
daemon_n Offline
Administrators

Posts: 4338
Post: #188

Есть ли разница, что использовать "SN:M" или "SN:V", и возможно ли создание (и как?) двумерных массивов?
01.07.2021 13:36
Visit this user's website Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16485
Post: #189

1. Разница есть лишь в случае, если затрагивается несколько значений подряд.

2. Двумерный массив — только как массив массивов. Первый массив хранит ID массивов второго измерения.
Например, массив на 48 городов, каждый из которых массив на 7 слотов. Инициализация такого массива потребует цикла.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
01.07.2021 18:37
Find all posts by this user Quote this message in a reply
daemon_n Offline
Administrators

Posts: 4338
Post: #190

Berserker, отлично) попробую с этим что-нибудь придумать)

А ещё мне нужно убрать определённые элемент из массива, удалив его из середины и уменьшить размер массива

Знаю номер элемента и размер - подойдёт ли Array_PoP?

UPD: осознал, что нет.
Получается, надо перезаписывать в иной массив на 1 итем меньше?
А потом клонировать всё обратно - верно?


Суть - делаю исследования заклинаний;
Сейчас на этапе, где надо удалить из массива доступных заклинаний то, что "изучил". И ещё то, от которого отказался.

UPD:UPD: сместил значения и поменял ненужный элемент с последним. После удалил через Array_PoP

А есть альтернатива?
01.07.2021 18:51
Visit this user's website Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16485
Post: #191

daemon_n, классически есть два варианта удаления элемента массива из середины:

1) Как ты сделал. Последний элемент помещаем на место удалённого и уменьшаем размер массива. При этом страдает порядок.
2) Сместить в цикле все элементы после удалённого на 1 влево, а после уменьшить размер массива на 1.

Первый вариант работает быстро. O(1) сложность. Второй обладает линейной сложностью O(N), то есть чем больше массив, тем больше операций.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
01.07.2021 20:16
Find all posts by this user Quote this message in a reply
SergOz Offline

Posts: 1292
Post: #192

(01.07.2021 18:37)Berserker Wrote:  Двумерный массив — только как массив массивов. Первый массив хранит ID массивов второго измерения
Girl_werewolf А-а-а-а-а!!!
Почему я раньше не додумался до этого?
Мне так нужна была такая таблица... Теперь смогу реализовать задуманное.
Только чуть позже: работы невпроворот, да ещё этот Laie_20 отвлекает


Карта-мод "Война на Холсте"
01.07.2021 21:02
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16485
Post: #193

SergOz, альтернативу вспомнил. Если нужен массив N * M, выделяется один большой массив N * M, а индекс конкретной ячейки [i, j] вычисляется как i * M + j


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
02.07.2021 01:36
Find all posts by this user Quote this message in a reply
SergOz Offline

Posts: 1292
Post: #194

Berserker, спасибо.
Как по мне, то альтернативный вариант сложнее и в "понимании", и в дальнейшей работе с ним Scratch_one-s_head
Кстати, я тогда всё крутил в голове вариант с использованием !!PO:V#/$; позволяющим сохранять до 4-х значений (мне нужна таблица 4х120), но так и не "врубился" как это оформить в виде рабочего скрипта. И, кстати, я тогда про динамические массивы и не знал...


Карта-мод "Война на Холсте"
(This post was last modified: 02.07.2021 03:58 by SergOz.)
02.07.2021 03:36
Find all posts by this user Quote this message in a reply
daemon_n Offline
Administrators

Posts: 4338
Post: #195

SergOz, срочно изучай ERA changelog iii.txt и, самое главное, HoMM 3 ERA\Mods\Era Erm Framework\Data\s 9999 era - stdlib.erm

Поиском всё, что имеет в себе "Array" - затем возвращайся сюда благодарить Berserker'a за (ещё один) огромный ПОДАРОК, сделанный всем модерам Yes
02.07.2021 10:29
Visit this user's website Find all posts by this user Quote this message in a reply
« Next Oldest | Next Newest »
Post Reply 


Forum Jump:

Powered by MyBB Copyright © 2002-2024 MyBB Group