Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 9 из 9
  1. #1
    Аватар для Seregamil
    Проверенный

    Статус
    Оффлайн
    Регистрация
    21.11.2013
    Сообщений
    551
    Репутация:
    274 ±

    Динамические массивы ( EXPERIMENTAL )

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

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

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

     List<string>.Create

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

    Пример использования:
    PHP код:
    new stringArray = List<string>.Create(); 


     List<string>.Add

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

    Параметры:

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

    Пример использования:
    PHP код:
    List<string>.AddstringArray"А Серёжа молодец =)" );
    List<
    string>.AddstringArray"Сам не похвалишь - никто не похвалит" ); 


     List<string>.AddRange

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

    Параметры:

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

    Пример использования:
    PHP код:
    new values[][] = { "by Seregamil""2015""Experemental" } ;
    List<
    string>.AddRangestringArrayvalues ); 


     List<string>.Get

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

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

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

    Пример использования:
    PHP код:
    new stringArray = List<string>.Create();
    new 
    values[][] = { "by Seregamil""2015""Experemental" } ;
    List<
    string>.AddRangestringArrayvalues );

    new 
    = -;
    while( ++
    != List<string>.LengthstringArray )) print( List<string>.GetstringArray) ); 


     List<string>.IndexOf

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

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

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

    Пример использования:
    PHP код:
    new stringArray = List<string>.Create();
    new 
    values[][] = { "by Seregamil""2015""Experemental" } ;
    List<
    string>.AddRangestringArrayvalues );

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


     List<string>.Length

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

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

    Пример использования:
    PHP код:
        new stringArray = List<string>.Create();

        new 
    values[][] = { "by Seregamil""2015""Experemental" } ;
        List<
    string>.AddRangestringArrayvalues );

        new 
    = -;
        while( ++
    != List<string>.LengthstringArray )) {
            print( List<
    string>.GetstringArray) );
        } 


     List<string>.SetID

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

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

    Пример использования:
    PHP код:
    List<string>.SetIDstringArray2); 


     List<string>.Swap

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

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

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

    PHP код:
    List<string>.SwapstringArray2); 


     List<string>.Insert

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

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

    Пример использования:
    PHP код:
    List<string>.InsertstringArray0"Какой-нибудь текст, у меня фантазия как у хламидомонады." ); 


     List<string>.RemoveAt

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

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

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

    PHP код:
    List<string>.RemoveAtstringArray) ; 


     List<string>.Remove

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

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

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

    PHP код:
    List<string>.RemovestringArray"А Серёжа молодец =)" ); 


    Пример простого скрипта:
    PHP код:
        new stringArray = List<string>.Create();

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

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

        List<
    string>.SwapstringArray5);

        new 
    = -;
        while( ++
    != List<string>.LengthstringArray )) {
            print( List<
    string>.GetstringArray) );
        } 
    Результат:



    Ссылка на инклуд: https://gist.github.com/Seregamil/6b439d7cd27a878a4dc9
    Автор: Seregamil
    Последний раз редактировалось Seregamil; 08.11.2015 в 21:42.

  2. 3 пользователя(ей) сказали cпасибо:
    $continue$ (08.11.2015) L0ndl3m (08.11.2015) [ForD] (08.11.2015)
  3. #2
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Касаемо принципа работы, реализация на getproperty/setproperty крайне медленная.
    Ладно бы реализация была на функциях GVar или Memory access plugin.
    Последний вариант обладает наиболее гибким функционалом, да и скорость работы тоже высокая, но для него уже есть реализация списков, да к тому же, от самого разработчика плагина.

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

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

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

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

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

  4. Пользователь сказал cпасибо:
    Seregamil (08.11.2015)
  5. #3
    Аватар для Seregamil
    Проверенный

    Статус
    Оффлайн
    Регистрация
    21.11.2013
    Сообщений
    551
    Репутация:
    274 ±
    Для чего в инклуде вообще нужна эта строка?
    Макросы взял из стандартного инклуда 'core.inc' и нагло переименовал их.
    Элементарная ошибка в слове "Length". Причём, ещё и повторяющаяся во всех случаях написания этого слова.
    #яжкитаец
    Изменил, спасибо, буду внимательней.
    Если перед использованием инклуда уже было создано свойство с индексом 1, оно будет перезаписано.
    После этого может произойти перезапись и других свойств. Использовал бы вместо ID от 0 до 100 какой-нибудь хэш от идентификатора, что ли...
    Кроме того, нет никакой проверки на превышение лимита списков. Как результат - получится выход за пределы массива. Выполнение кода прервётся без какой-либо возможности для скриптера обработать эту ошибку.
    Это дело прорабатывается. Сей сборка весьма и весьма сырая. Выход за пределы массива тоже обсуждался в конфе. Исправляется, на днях обновлю.
    Среди прочего можно заметить, что табы смешаны с пробелами. На жидхабе из-за этого становится сложнее читать код, т.к. там 1 таб эквивалентен 8 пробелам вместо 4-х.
    Я понятия не имею, почему у жидхаба такая реакция. В редакторе кода весь код сделан исключительно табами.
    fixed
    Касаемо принципа работы, реализация на getproperty/setproperty крайне медленная.
    Ладно бы реализация была на функциях GVar или Memory access plugin.
    Последний вариант обладает наиболее гибким функционалом, да и скорость работы тоже высокая, но для него уже есть реализация списков, да к тому же, от самого разработчика плагина.
    Мне предлагали использовать SVar's, НО это просто бредовая затея. Может у меня фантазия слабо развита, но я банально не могу себе представить написание кода, опираясь на эти функции.
    И основная идея была - написание рабочей системы без использования сторонних плагинов и разработок.

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

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

    А, ну и по скорости.
    Тесты показали вполне вменяемый результат.
    Последний раз редактировалось Seregamil; 08.11.2015 в 21:53.

  6. #4
    Аватар для $continue$
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.08.2014
    Адрес
    г. Киров (aka Вятка)
    Сообщений
    1,487
    Репутация:
    276 ±
    Конечно, извращеннство. Смысл "листа" в Pawn? Зачем допиливать то, что не принадлежит Pawn? Зачем помогать сообществу Куя, раз он выбрал язык который встраивается в пару строк?
    Вы ещё классы (ООП притащите в Pawn...)
    Value your freedom or you will lose it, teaches history. "Don't bother us with politics," respond those who don't want to learn. (c) Richard Stallman

  7. #5
    Аватар для Seregamil
    Проверенный

    Статус
    Оффлайн
    Регистрация
    21.11.2013
    Сообщений
    551
    Репутация:
    274 ±
    Цитата Сообщение от $continue$ Посмотреть сообщение
    Конечно, извращеннство. Смысл "листа" в Pawn? Зачем допиливать то, что не принадлежит Pawn? Зачем помогать сообществу Куя, раз он выбрал язык который встраивается в пару строк?
    Вы ещё классы (ООП притащите в Pawn...)
    Мне понадобились динамические массивы - я их сделал. Да,они еще сырые, но это исправляется.

  8. #6
    Аватар для Spectrum
    Пользователь

    Статус
    Оффлайн
    Регистрация
    14.04.2014
    Адрес
    Omsk, Russia
    Сообщений
    349
    Репутация:
    49 ±
    а как же стримеровские?
    Skype: sp3ctrum_attack

  9. #7
    Аватар для Seregamil
    Проверенный

    Статус
    Оффлайн
    Регистрация
    21.11.2013
    Сообщений
    551
    Репутация:
    274 ±
    Цитата Сообщение от Spectrum Посмотреть сообщение
    а как же стримеровские?
    На то они и стримеровские =)
    Не всегда же подключается он.

  10. #8
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от Seregamil Посмотреть сообщение
    И основная идея была - написание рабочей системы без использования сторонних плагинов и разработок.
    ИМХО, такие идеи в большинстве своём изначально обречены на провал. Если люди не пользуются какими-то стандартными возможностями сервера, а создают и используют плагины, значит на то есть свои причины. Точно так же и здесь.

    Вот сравнение функций семейства property с функциями из GVar:
    200739 тиков против 166 при записи значений и 195040 против 52 при чтении.
    Но мало того, что функции getproperty и setproperty медленные, так они ещё и используются не самым безопасным образом (см. мой предыдущий пост).

    Если же взять функции семейства SVar, то да, они работают быстрее, чем аналоги из плагина GVar, но чем больше ID такого SVar'а, тем медленнее к нему доступ. Да к тому же, ещё и количество этих SVar'ов ограничено (2000 максимум) - SVar'ы могут закончиться в любой момент, что может привести к ошибкам в алгоритме, полагающемся на такую реализацию массивов. Вряд ли такой вариант будет пригоден для серьёзного использования.

    Суммируя всё, что я написал об этой работе в этом и прошлом посте, получаем следующее:
    1. Медленная реализация.
    2. Если придерживаться той же идеологии с использованием только стандартных возможностей SA:MP, то функции SVar быстрее, но их кол-во ограничено.
    3. Уже давно есть реализация динамических массивов в плагине Vectorial Pawn. При этом никаких лимитов или рисков того, что ID какого-то нового элемента совпадёт с ID уже существующего элемента, как в функциях *property.

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

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

  11. #9
    Аватар для Seregamil
    Проверенный

    Статус
    Оффлайн
    Регистрация
    21.11.2013
    Сообщений
    551
    Репутация:
    274 ±
    Описанное выше я не отрицал и не оспаривал =)
    @Seregamil: Можешь обвинить меня в том, что я пытаюсь "завалить" твои работы. Да, я не буду отрицать, о твоей предыдущей работе я тоже был далеко не лучшего мнения. Но и идея там была та же самая: "сделать X без сторонних плагинов и разработок". Собственно, с производительностью результат оказался немного предсказуем.
    Ну а это я прокомментирую. Я прекрасно знаю, что большая часть моих работ - ни о чем. Та "разработка" предназначалась для определения районов, в которых располагались дома при переводе данных из файлов в БД. Единичное использование. А подключать ради этого стример - зачееем, когда можно сделать что-то самому.

 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •