PDA

Просмотр полной версии : [Include] Динамические массивы ( EXPERIMENTAL )



Seregamil
08.11.2015, 20:31
В общем, это экспериментальная разработка, которая на данный момент работает только с данными типа string.
Да, я знаю о существовании плагина от Владокса, но его и моя разработка - разные проекты.

Подробнее о динамических массивах:
Динамическим называется массив, размер которого,при необходимости, может меняться во время исполнения программы.
Вы можете по желанию добавлять или удалять из него строки, и при этом вы не ограничены размерами массива.

И так, функционал представлен 11-ю функциями.


Инициализирует новый динамический массив.
Возвращает ID массива.

Пример использования:

new stringArray = List<string>.Create();



Добавляет новую строку в конец массива.

Параметры:

_ID - ID массива
item[] - текстовое значение

Пример использования:


List<string>.Add( stringArray, "А Серёжа молодец =)" );
List<string>.Add( stringArray, "Сам не похвалишь - никто не похвалит" );




Добавляет массив строк range в конец динамического массива.

Параметры:

_ID - ID массива
range[][] - массив с набором строк

Пример использования:


new values[][] = { "by Seregamil", "2015", "Experemental" } ;
List<string>.AddRange( stringArray, values );



Возвращает строку, помещенную в массив, по её индексу.

Параметры:
_ID - ID массива
index - номер получаемой строки

Возвращает строку типа string

Пример использования:


new stringArray = List<string>.Create();
new values[][] = { "by Seregamil", "2015", "Experemental" } ;
List<string>.AddRange( stringArray, values );

new j = -1 ;
while( ++j != List<string>.Length( stringArray )) print( List<string>.Get( stringArray, j ) );




Возвращает индекс первого вхождения элемента в массиве.

Параметры:
_ID - ID массива
item[] - Искомая часть текста

Возвращает ID строки в массиве.

Пример использования:


new stringArray = List<string>.Create();
new values[][] = { "by Seregamil", "2015", "Experemental" } ;
List<string>.AddRange( stringArray, values );

printf( "%i", List<string>.IndexOf( stringArray, "Seregamil" ) ); // output: 0




Возвращает длину массива.

Параметры:
_ID - ID массива

Пример использования:


new stringArray = List<string>.Create();

new values[][] = { "by Seregamil", "2015", "Experemental" } ;
List<string>.AddRange( stringArray, values );

new j = -1 ;
while( ++j != List<string>.Length( stringArray )) {
print( List<string>.Get( stringArray, j ) );
}




Ставит строку с индексом oldIndex на новое место, тобишь, newIndex.

Параметры:
_ID - ID массива
oldIndex - ID строки
newIndex - новый ID строки

Пример использования:

List<string>.SetID( stringArray, 2, 3 );



Меняет местами строки X и Y.

Параметры:
_ID - ID массива
X - ID первой строки
Y - ID второй строки

Пример использования:


List<string>.Swap( stringArray, 2, 0 );



Вставляет строку item на позицию index

Параметры:
_ID - ID массива
index - позиция, в которое встанет строка
item[] - строка

Пример использования:

List<string>.Insert( stringArray, 0, "Какой-нибудь текст, у меня фантазия как у хламидомонады." );



Удаляет строку по её индексу.

Параметры:
_ID - ID массива
index - индекс удаляемой строки

Пример использования:


List<string>.RemoveAt( stringArray, 2 ) ;



Удаляет строку по её содержимому. Содержимое сверяется.

Параметры:
_ID - ID массива
item[] - строка

Пример использования:


List<string>.Remove( stringArray, "А Серёжа молодец =)" );


Пример простого скрипта:


new stringArray = List<string>.Create();

new values[][] = { "by Seregamil", "2015", "Experemental", "------------" } ;
List<string>.AddRange( stringArray, values );

List<string>.Add( stringArray, "В общем это тестовое сообщение" );
List<string>.Add( stringArray, "Разработка весьма и весьма эксперементальная" );
List<string>.Add( stringArray, "Использовать на свой страх и риск" );

List<string>.Swap( stringArray, 5, 6 );

new j = -1 ;
while( ++j != List<string>.Length( stringArray )) {
print( List<string>.Get( stringArray, j ) );
}


Результат:

http://i.imgur.com/fq7omIm.png

Ссылка на инклуд: https://gist.github.com/Seregamil/6b439d7cd27a878a4dc9
Автор: Seregamil

Daniel_Cortez
08.11.2015, 21:23
Касаемо принципа работы, реализация на getproperty/setproperty крайне медленная.
Ладно бы реализация была на функциях GVar (http://forum.sa-mp.com/showthread.php?t=151076) или Memory access plugin (http://forum.sa-mp.com/showthread.php?t=451381).
Последний вариант обладает наиболее гибким функционалом, да и скорость работы тоже высокая, но для него уже есть реализация списков (http://forum.sa-mp.com/showthread.php?t=451962), да к тому же, от самого разработчика плагина.

А теперь взглянем на код.



#pragma library multiArray
Для чего в инклуде вообще нужна эта строка?



stock StringArrayLenght( _ID )
Элементарная ошибка в слове "Length". Причём, ещё и повторяющаяся во всех случаях написания этого слова.



stock StringArrayCreate() {
new _ID = getproperty( .id = 0, .name = "stringArrays" ) + 1 ;
Если перед использованием инклуда уже было создано свойство с индексом 1, оно будет перезаписано.
После этого может произойти перезапись и других свойств. Использовал бы вместо ID от 0 до 100 какой-нибудь хэш от идентификатора, что ли...
Кроме того, нет никакой проверки на превышение лимита списков. Как результат - получится выход за пределы массива. Выполнение кода прервётся без какой-либо возможности для скриптера обработать эту ошибку.

Среди прочего можно заметить, что табы смешаны с пробелами. На жидхабе из-за этого становится сложнее читать код, т.к. там 1 таб эквивалентен 8 пробелам вместо 4-х.
Это всё, что я пока что смог найти.

Seregamil
08.11.2015, 22:09
Для чего в инклуде вообще нужна эта строка?
Макросы взял из стандартного инклуда 'core.inc' и нагло переименовал их.

Элементарная ошибка в слове "Length". Причём, ещё и повторяющаяся во всех случаях написания этого слова.
#яжкитаец
Изменил, спасибо, буду внимательней.

Если перед использованием инклуда уже было создано свойство с индексом 1, оно будет перезаписано.
После этого может произойти перезапись и других свойств. Использовал бы вместо ID от 0 до 100 какой-нибудь хэш от идентификатора, что ли...
Кроме того, нет никакой проверки на превышение лимита списков. Как результат - получится выход за пределы массива. Выполнение кода прервётся без какой-либо возможности для скриптера обработать эту ошибку.
Это дело прорабатывается. Сей сборка весьма и весьма сырая. Выход за пределы массива тоже обсуждался в конфе. Исправляется, на днях обновлю.

Среди прочего можно заметить, что табы смешаны с пробелами. На жидхабе из-за этого становится сложнее читать код, т.к. там 1 таб эквивалентен 8 пробелам вместо 4-х.
Я понятия не имею, почему у жидхаба такая реакция. В редакторе кода весь код сделан исключительно табами.
fixed

Касаемо принципа работы, реализация на getproperty/setproperty крайне медленная.
Ладно бы реализация была на функциях GVar или Memory access plugin.
Последний вариант обладает наиболее гибким функционалом, да и скорость работы тоже высокая, но для него уже есть реализация списков, да к тому же, от самого разработчика плагина.
Мне предлагали использовать SVar's, НО это просто бредовая затея. Может у меня фантазия слабо развита, но я банально не могу себе представить написание кода, опираясь на эти функции.
И основная идея была - написание рабочей системы без использования сторонних плагинов и разработок.

Будем исправляться. Спасибо.

- - - Добавлено - - -

А, ну и по скорости.
Тесты показали вполне вменяемый результат.

$continue$
09.11.2015, 02:03
Конечно, извращеннство. Смысл "листа" в Pawn? Зачем допиливать то, что не принадлежит Pawn? Зачем помогать сообществу Куя, раз он выбрал язык который встраивается в пару строк?
Вы ещё классы (ООП притащите в Pawn...)

Seregamil
09.11.2015, 07:01
Конечно, извращеннство. Смысл "листа" в Pawn? Зачем допиливать то, что не принадлежит Pawn? Зачем помогать сообществу Куя, раз он выбрал язык который встраивается в пару строк?
Вы ещё классы (ООП притащите в Pawn...)

Мне понадобились динамические массивы - я их сделал. Да,они еще сырые, но это исправляется.

Spectrum
10.11.2015, 17:02
а как же стримеровские?

Seregamil
11.11.2015, 06:30
а как же стримеровские?

На то они и стримеровские =)
Не всегда же подключается он.

Daniel_Cortez
11.11.2015, 22:03
И основная идея была - написание рабочей системы без использования сторонних плагинов и разработок.
ИМХО, такие идеи в большинстве своём изначально обречены на провал. Если люди не пользуются какими-то стандартными возможностями сервера, а создают и используют плагины, значит на то есть свои причины. Точно так же и здесь.

Вот сравнение функций семейства property с функциями из GVar:

http://forum.sa-mp.com/showpost.php?p=703181&postcount=33
200739 тиков против 166 при записи значений и 195040 против 52 при чтении.
Но мало того, что функции getproperty и setproperty медленные, так они ещё и используются не самым безопасным образом (см. мой предыдущий пост).

Если же взять функции семейства SVar, то да, они работают быстрее, чем аналоги из плагина GVar, но чем больше ID такого SVar'а, тем медленнее к нему доступ. Да к тому же, ещё и количество этих SVar'ов ограничено (2000 максимум (http://forum.sa-mp.com/showthread.php?t=151076&page=17)) - SVar'ы могут закончиться в любой момент, что может привести к ошибкам в алгоритме, полагающемся на такую реализацию массивов. Вряд ли такой вариант будет пригоден для серьёзного использования.

Суммируя всё, что я написал об этой работе в этом и прошлом посте, получаем следующее:
Медленная реализация.
Если придерживаться той же идеологии с использованием только стандартных возможностей SA:MP, то функции SVar быстрее, но их кол-во ограничено.
Уже давно есть реализация динамических массивов в плагине Vectorial Pawn (http://forum.sa-mp.com/showthread.php?t=364285). При этом никаких лимитов или рисков того, что ID какого-то нового элемента совпадёт с ID уже существующего элемента, как в функциях *property.

Итог: если делать реализацию динамических массивов на стандартных возможностях SA:MP, то разве что как proof-of-concept, т.е. только как доказательство того, что это можно реализовать. Вряд ли такая работа будет пригодна для повседневного использования, если и производительность хромает, и есть куда более быстрые и безопасные реализации.

@Seregamil: Можешь обвинить меня в том, что я пытаюсь "завалить" твои работы. Да, я не буду отрицать, о твоей предыдущей работе (http://pro-pawn.ru/showthread.php?12760) я тоже был далеко не лучшего мнения. Но и идея там была та же самая: "сделать X без сторонних плагинов и разработок". Собственно, с производительностью результат оказался немного предсказуем.

Seregamil
12.11.2015, 20:04
Описанное выше я не отрицал и не оспаривал =)

@Seregamil: Можешь обвинить меня в том, что я пытаюсь "завалить" твои работы. Да, я не буду отрицать, о твоей предыдущей работе я тоже был далеко не лучшего мнения. Но и идея там была та же самая: "сделать X без сторонних плагинов и разработок". Собственно, с производительностью результат оказался немного предсказуем.

Ну а это я прокомментирую. Я прекрасно знаю, что большая часть моих работ - ни о чем. Та "разработка" предназначалась для определения районов, в которых располагались дома при переводе данных из файлов в БД. Единичное использование. А подключать ради этого стример - зачееем, когда можно сделать что-то самому.