SA-MP Forums Archive
[Plugin] Dynamic memory v1.2.1 - Printable Version

+- SA-MP Forums Archive (https://sampforum.blast.hk)
+-- Forum: Non-English (https://sampforum.blast.hk/forumdisplay.php?fid=9)
+--- Forum: Languages (https://sampforum.blast.hk/forumdisplay.php?fid=33)
+---- Forum: Русский/Russian (https://sampforum.blast.hk/forumdisplay.php?fid=32)
+----- Forum: Релизы/Releases (https://sampforum.blast.hk/forumdisplay.php?fid=66)
+----- Thread: [Plugin] Dynamic memory v1.2.1 (/showthread.php?tid=141013)



Dynamic memory v1.2.1 - Zeex - 11.04.2010

Мой первый плагин

Знаю, что подобные поделки уже существуют, но все же....

Данный плуг предназначен для управления (выделения/копирования/освобождения) динамической памятью напрямую через скрипты. Это удобно, например, если вы имеете дело с очень большими объемами данных, но не можете/не хотите иметь при этом *.amx чудовищно огромных размеров.

Выглядит это слегка коряво, по сравнению, скажем, с Cи (все данные, помещаемые в динамический "буфер", нельзя подать напрямую какой-нибудь стандартной функции, нужно сначала извлечь их во временный массив; указателей и подавно нет). Однако более удобной/гибкой реализации мне в голову, к сожалению, пока не пришло... так что если у вас есть предложения по улучшению/ усовершенствованию плагина - пишите!


Функции

Есть всего семь функций. Каждая оперирует с переменным типа Pointer: (указатель), которые на самом деле являются адресами выделенных участков памяти. Хотя звучит все просто, на самом деле не любой указатель можно передать в качестве аргумента (в целях безопасности), а лишь указывающий на один из выделенных блоков. Все они хранятся в специальной структуре (АВЛ-дерево), поиск по которой происходит довольно быстро, так что данные меры не сильно влияют на производительность.


pawn Код:
/* Выделяет участок динамической памяти определенного размера.
 *
 * Параметры:
 *  size - рамер блока (в ячейках, не в байтах)
 *  clear - если true, каждая ячейка выделенного участка будет заполнена указанным значенем.
 *  value - значение, которым необходимо заполнить все ячейки.
 *  
 * Возвращает:
 *  Указатель на выделенный блок или NULL в случае ошибки (например, не хватило памяти).
 */

native Pointer:mem_allocate(size, bool:clear = false, value = 0);


/* Изменяет размер выделенного участка памяти.
 *
 * Параметры:
 *  ptr   - указатель.
 *  new_size - новый размер.
 *  
 * Возвращает:
 *  true при отсутствии ошибок, иначе - false.
 */

native bool:mem_resize(Pointer:ptr, new_size);


/* Освобождает память.
 *
 * Параметры:
 *  ptr - указатель на освобождаемый блок.
 *  
 * Возвращает:
 *  true при отсутствии ошибок, иначе - false.
 *
 * Замечание: после вызова данной функции значение ptr недействительно
 *      и не может быть больше использовано, т.к. указывает на
 *      несуществующий блок.
 */

native bool:mem_free(Pointer:ptr);


/* Копирует содержимое блока в указанный массив.
 *
 * Параметры:
 *  source - указатель на копируемый.
 *  dest  - буфер, в который производится копиррование.
 *  start - индекс первой копируемой ячейки (ее номер в блоке).
 *  count - количество копируемых ячеек.
 *  
 * Возвращает:
 *  Число копированных элементов.
 */

native mem_get(Pointer:source, dest[], start = 0, count = sizeof(dest));


/* Копирует содержимое массива в указанный блок.
 *
 * Параметры:
 *  dest  - указатель на блок, в который записывается массив.
 *  source - массив, элементы которого копировать.
 *  start  - индекс первой копируемой ячейки (ее номер в блоке).
 *  count - количество копируемых ячеек.
 *  
 * Возвращает:
 *  Число копированных элементов.
 */

native mem_set(Pointer:dest, const source[], start = 0, count = sizeof(source));


/* Копирует содержимое одного блока в другой.
 *
 * Параметры:
 *  source - указатель на копируемый блок.
 *  dest   - указатель на второй блок, в который будет производена запись.
 *  
 * Возвращает:
 *  Число копированных элементов.
 */

native mem_copy(Pointer:source, Pointer:dest);


/* Узнает размер ранее выделенного участка.
 *
 * Параметры:
 *  ptr - указатель на блок.
 *  
 * Возвращает:
 *  Размер блока.
 */

native mem_size(Pointer:ptr);


Скачать

Как скомпилировать


Список изменений

pawn Код:
[13/04/2010]: v1.2.1
    - Добавлена функция mem_size

 [12/04/2010]: v1.2
    - Изменены параметры некоторых функций
    - Исправлены ошибки в процедурах mem_get/set/copy
    - В инклуд добавлен удобный макрос, позволяющий выделять память прямо при объявлении указателя, без явного вызова mem_allocate

 [11/04/2010]: v1.1
    - Исправлен баг в mem_allocate, привыодивший к ошибке "out of memory"
    - Исправлено падение сервера при вызове mem_free для некорректного адреса
    - Исправлены мелкие недоработки при выводе сообщений об ошибках

 [11/04/2010]: v1.0
    - Первая версия



Re: [PLUGIN] Dynamic memory v1.0 - ^Woozie^ - 11.04.2010

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


Re: [PLUGIN] Dynamic memory v1.0 - Zeex - 11.04.2010

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

Ed: исходный код и файлы для Windows перезалиты, Linux-версия будет в скором времени тоже


Re: [PLUGIN] Dynamic memory v1.1 - [JIeXa] - 11.04.2010

мм, а через new никак не получится?
или простенькую систему деревьев, но не такую сложную...
примеры можно посмотреть тут:
http://shatalov.su/algorithms/tree.php
http://shatalov.su/algorithms/list_1.php
http://shatalov.su/algorithms/list_2.php


Re: [PLUGIN] Dynamic memory v1.1 - Zeex - 11.04.2010

Ну дак там и так дерево
http://ru.wikipedia.org/wiki/%D0%90%...B5%D0%B2%D0%BE


Re: [PLUGIN] Dynamic memory v1.1 - MX_Master - 11.04.2010

Нужная весч (: зачот

Лично мне-то сразу стало ясно как использовать. Но для тех, кто не понял нужны примеры и, хотя бы, предполагаемые области применения. Так скать, если юзер будет знать, где это применить, респект гарантирован (:


Re: [PLUGIN] Dynamic memory v1.1 - Romanius - 11.04.2010

молодец Zeex


Re: [PLUGIN] Dynamic memory v1.1 - Zeex - 12.04.2010

В результате тестов сегодня были обнаружены серьезные недоработки в механизме копирования/записи блоков... скоро выйдет новая версия


Re: [PLUGIN] Dynamic memory v1.1 - xomka - 12.04.2010

Ну, яростно требую мануала с примерами по этой штуке. Например, как в выделенную память записать массив (строку с символами) или значение типа float. Респекты уже.


Re: [PLUGIN] Dynamic memory v1.2 - Zeex - 12.04.2010

Обновление! Подробности в чейнджлоге

Также в шапку добавлена ссылка на небольшой пример