[SourcePawn] Урок 9 - ADT Array (ArrayList)

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #1
[SourcePawn] Урок 9 - ADT Array (ArrayList)

<- К содержанию

ArrayList - производный тип от Handle, который являет собою автоматически расширяемый массив, позволяющий хранить в себе данные разных и почти любых типов.
Размер массива увеличивается по мере добавления в него данных. Так же он уменьшается при удалении данных.

Методы для работы с ArrayList можно найти здесь ArrayList· adt_array· SourceMod Scripting API Reference

Рассмотрим их подробнее:
  • Методы ArrayList
    • ArrayList - Создает объект типа ArrayList
      PHP:
      ArrayList(int blocksize, int startsize)
      • int blocksize - количество ячеек в каждом элементе массива. По умолчанию = 1.
        PHP:
        int iArray[X][32]; // 32 и будет значением blocksize
        Это часто используется при хранении строк (или других массивов) в этом массиве.
        Например, зная что в массиве будут хранится строки, размер которых, не превышает 64 символа мы должны создать ArrayList так:
        PHP:
        ArrayList hArray = new ArrayList(ByteCountToCells(64));
        Функция ByteCountToCells возвращает количество ячеек необходимых для хранения указанного количества байт.
      • int startsize - устанавливает начальный размер массива. По умолчанию = 0.
      PHP:
      ArrayList hArray = new ArrayList(); // Пустой массив
      
      ArrayList hArray = new ArrayList(ByteCountToCells(64)); // Пустой массив с размером элементов 64 ячейки
      
      ArrayList hArray = new ArrayList(1, 8); // Массив из 8-ми элементов, размер каждого элемента - 1 ячейка. Значения этих элементов содержат мусор находившийся в памяти, поэтому в них важно будет записать свои данные.
    • Push - Добавляет элемент в конец ArrayList. Возвращает индекс добавленного элемента.
      PHP:
      hArray.Push(6); // Добавим в конце массива элемент со значением 6
      hArray.Push(7.3); // Добавим в конце массива элемент со значением 7.3
    • PushString - Добавляет элемент типа char в конец ArrayList. Возвращает индекс добавленного элемента. Если размер записываемой строки больше чем максимальный размер элемента - строка будет обрезана.
      PHP:
      hArray.PushString("my string"); // Добавим в конце массива строку
      hArray.PushString("two string");
    • PushArray - Добавляет элемент (массив) в конец ArrayList. Возвращает индекс добавленного элемента.
      PHP:
      hArray.PushArray({6, 9}, 2); // 6 и 9 элементы массива, 2 - размер массива
      hArray.PushArray({5.2304, -3412.340, 0.35}, 3); // Таким образом можно записывать координаты или углы (float[3])
    • Set - Устанавливает значение указанному элементу ArrayList.
      PHP:
      void Set(int index, any value, int block, bool asChar)
      • int index - Индекс элемента
      • any value - Значение
      • int block - Индекс блока для записи (при blocksize > 0)
      • bool asChar - true если записываем символ, а не значение
      PHP:
      hArray.Set(3, 6); // Установим элементу с индексом 3 значение 6
      hArray.Set(0, 7.3); // Установим элементу с индексом 0 значение 7.3
      // Если массив имеет вид:
      
      ArrayList hArray = new ArrayList(3, 15); // Размер элемента = 3, Размер массива = 15.
      // Этот Массив предназначен для хранения координат. Если хотим изменить x координату элемента с индексом 3
      hArray.Set(3, -5.001, 0); // x = 0, y = 1, z = 2
      // Если хотим изменить z координату элемента с индексом 9
      hArray.Set(9, 27.846, 2); // x = 0, y = 1, z = 2
    • SetString - Устанавливает значение типа char элементу ArrayList.
      PHP:
      hArray.SetString(4, "my string 4"); // Индекс 4
    • SetArray - Устанавливает массив значений элементу ArrayList.
      PHP:
      hArray.SetArray(2, {6, 9}, 2); // Индекс 2
      hArray.SetArray(7, {5.2304, -3412.340, 0.35}, 3); // Индекс 7
    • Get - Получает значение элемента ArrayList.
      PHP:
      int iVar1 = hArray.Get(3); // Индекс 3
      float fVar2 = hArray.Get(7); // Индекс 7
    • GetString - Получает строчное (char) значение элемента ArrayList.
      PHP:
      char szBuffer[64];
      hArray.GetString(4, szBuffer, sizeof(szBuffer)); // Индекс 4
    • GetArray - Получает массив значений элемента ArrayList.
      PHP:
      int iArray[2];
      hArray.GetArray(7, iArray, 2); // Индекс 7
      
      float fPosition[3];
      hArray.GetArray(12, fPosition, 3); // Индекс 12
    • Clear - Очищает ArrayList.
      PHP:
      hArray.Clear();
    • Resize - Устанавливает размер элементов ArrayList.
      PHP:
      hArray.Resize(6);
    • Clone - Создает копию ArrayList.
      PHP:
      ArrayList hArray2 = hArray.Clone(6);
    • Erase - Удаляет элемент из ArrayList. Все индексы больше указанного смещаются вниз на 1 позицию.
      PHP:
      hArray.Erase(6); // Удалим элемент с индексом 6
      
      //    Если в массиве было:
      //    Индекс - Значение
      //    0 - 7
      //    1 - 32.5
      //    2 - 89
      //    3 - 587
      //    4 - 2.23
      //    5 - 5.98
      //    6 - "sdf"
      //
      //    То станет:
      //    0 - 7
      //    1 - 32.5
      //    2 - 89
      //    3 - 587
      //    4 - 2.23
      //    5 - 5.98
      // Теперь если удалить элемент с индексом 2:
      hArray.Erase(2);
      // Получаем:
      //    0 - 7
      //    1 - 32.5
      //    2 - 587
      //    3 - 2.23
      //    4 - 5.98
    • ShiftUp - Смещает все элементы ArrayList начиная с указанного на 1 индекс вверх. При этом значение этого элемента становится не определено и может содержать что угодно.
      PHP:
      // Имеем ArrayList:
      //    0 - 7
      //    1 - 32.5
      //    2 - 89
      //    3 - 587
      //    4 - 2.23
      //    5 - 5.98
      
      hArray.ShiftUp(3);
      // Получаем:
      //    0 - 7
      //    1 - 32.5
      //    2 - 89
      //    3 - Не определено
      //    4 - 587
      //    5 - 2.23
      //    6 - 5.98
    • SwapAt - Меняет указанные элементы ArrayList местами.
      PHP:
      // Имеем ArrayList:
      //    0 - 7
      //    1 - 32.5
      //    2 - 587
      //    3 - 2.23
      
      hArray.SwapAt(1, 3);
      // Получаем:
      //    0 - 7
      //    1 - 2.23
      //    2 - 587
      //    3 - 32.5
    • FindValue - Получает индекс элемента ArrayList по его значению. Возвращает -1 если элемент не найден.
      Используется для поиска элементов по значению
      PHP:
      // Имеем ArrayList:
      //    0 - 7
      //    1 - 32.5
      //    2 - 587
      //    3 - 2.23
      int index = hArray.FindValue(587);
      // index = 2
    • FindString - Получает индекс элемента ArrayList по его значению (char). Возвращает -1 если элемент не найден.
      Используется для поиска элементов по значению
      PHP:
      // Имеем ArrayList:
      //    0 - "my string 1"
      //    1 - "my string 2"
      //    2 - "my string 3"
      //    3 - "my string 4"
      int index = hArray.FindString("my string 2");
      // index = 1
  • Свойства ArrayList
    • Length - Получает текущий размер ArrayList
      PHP:
      // Имеем ArrayList:
      //    0 - 7
      //    1 - 32.5
      //    2 - 587
      //    3 - 2.23
      int iSize = hArray.Length;
      // iSize = 4

PHP:
ArrayList g_hGlobalArray;

public void OnPluginStart()
{
    g_hGlobalArray = new ArrayList(ByteCountToCells(64));

    g_hGlobalArray.PushString("dfsknj234"); // Индекс 0
    g_hGlobalArray.PushString("d2knj234"); // Индекс 1
    g_hGlobalArray.PushString("564sdf"); // Индекс 2

    g_hGlobalArray.Resize(g_hGlobalArray.Length+2); // Добавляем в конец 2 пустых элемента

    g_hGlobalArray.SetString(3, "sdf812");
    g_hGlobalArray.SetString(4, "bvn78se");

    g_hGlobalArray.ShiftUp(3); // Сдвинем всё начиная с 3-го индекса вверх.

    g_hGlobalArray.SetString(3, "fdg5641234");

    int i, iSize;
    char szBuffer[64];
    iSize = g_hGlobalArray.Length;
    PrintToServer("Size(GlobalArray) = %i", iSize);
    for(i = 0; i < iSize; ++i)
    {
        g_hGlobalArray.GetString(i, szBuffer, sizeof(szBuffer));
        PrintToServer("GlobalArray[%i] = '%s'", i, szBuffer);
    }

    ArrayList hLocalArray = new ArrayList(1, 4);
    hLocalArray.Set(0, 10923);
    hLocalArray.Set(1, 13519);
    hLocalArray.Set(2, 1930);
    hLocalArray.Set(3, 10878);
    hLocalArray.Push(3052);
    hLocalArray.Push(2060);
    hLocalArray.Push(15731);
    hLocalArray.Push(10282);

    hLocalArray.SwapAt(4, 6);

    i = hLocalArray.FindValue(1930);
    if(i != -1)
    {
        hLocalArray.Set(3, 345);
    }

    iSize = hLocalArray.Length;
    PrintToServer("Size(hLocalArray) = %i", iSize);
    for(i = 0; i < iSize; ++i)
    {
        PrintToServer("hLocalArray[%i] = %i", i, hLocalArray.Get(i));
    }

    delete hLocalArray;

    hLocalArray = new ArrayList(3);
    hLocalArray.PushArray({34, 345, 13}, 3);
    hLocalArray.PushArray({21, 28, 0}, 3);
    hLocalArray.PushArray({86, 43, 799}, 3);

    hLocalArray.Set(1, 172, 2, false); // В массиве {21, 28, 0} заменяем 0 на 172

    int iArray[3];
    iSize = hLocalArray.Length;
    PrintToServer("Size(hLocalArray2) = %i", iSize);
    for(i = 0; i < iSize; ++i)
    {
        hLocalArray.GetArray(i, iArray, 3);
        PrintToServer("hLocalArray2[%i] = {%i, %i, %i}", i, iArray[0], iArray[1], iArray[2]);
    }

    delete hLocalArray;
}


Результаты:
C-подобный:
Size(GlobalArray) = 6
GlobalArray[0] = 'dfsknj234'
GlobalArray[1] = 'd2knj234'
GlobalArray[2] = '564sdf'
GlobalArray[3] = 'fdg5641234'
GlobalArray[4] = 'sdf812'
GlobalArray[5] = 'bvn78se'

Size(hLocalArray) = 8
hLocalArray[0] = 10923
hLocalArray[1] = 13519
hLocalArray[2] = 345
hLocalArray[3] = 10878
hLocalArray[4] = 15731
hLocalArray[5] = 2060
hLocalArray[6] = 3052
hLocalArray[7] = 10282

Size(hLocalArray2) = 3
hLocalArray2[0] = {34, 345, 13}
hLocalArray2[1] = {21, 28, 172}
hLocalArray2[2] = {86, 43, 799}
 
Последнее редактирование:

BaFeR

Добрый человек
Сообщения
721
Реакции
216
Что не так?
PHP:
int iSize = 0;
ArrayList hArray = new ArrayList(Shop_CreateArrayOfItems(iSize));
warning 213: tag mismatch
 

Arthur Don

Участник
Сообщения
1,696
Реакции
256
PHP:
ArrayList hArray = new ArrayList(1, 8); // Массив из 8-ми элементов равных 0, размер каждого элемента - 1 ячейка
@R1KO, разве они будут равны нулю? Даже в самом API под startsize написано:
C-подобный:
int startsize

    Initial size of the array. Note that data will NOT be auto-initialized.
 
Последнее редактирование:
  • Мне нравится
Реакции: R1KO

Banana

Участник
Сообщения
892
Реакции
113
Помогите перевести массив такого типа char QuestionArray[100][5][256]; в ArrayList и передать его через Forward в public другого плагина.
Сообщения автоматически склеены:

@artushonok, мой провтык. Исправил


Скажите возможно ли вообще 3-мерные массивы в ArrayList записывать?
Сообщения автоматически склеены:

hArray.PushArray({"Вопрос1", "Ответ1_1", "Ответ2_1", "Ответ3_1", "Ответ4_1"}, 5); - такие данные нельзя записать?
 
Последнее редактирование:

Banana

Участник
Сообщения
892
Реакции
113
в PushArray можно записать char значения в массиве? Если я задаю глупые вопросы то ответе хоть .... а то создается впечатление что я думаю как-то не так)
 

Allen

love society
Сообщения
352
Реакции
274
  • Команда форума
  • #11
в PushArray можно записать char значения в массиве? Если я задаю глупые вопросы то ответе хоть .... а то создается впечатление что я думаю как-то не так)
Вы задаете слишком странные вопросы. К чему спрашивать, если можно самому проверить?
 

Banana

Участник
Сообщения
892
Реакции
113
Если мне не нужен больше
ArrayList hArray = new ArrayList();
то как очистить его без утечки памяти?
 

rejchev

менеджер клоунов
Сообщения
1,669
Реакции
1,291
Если мне не нужен больше
ArrayList hArray = new ArrayList();
то как очистить его без утечки памяти?

Для чистки есть методы:
C-подобный:
ArrayList.Clear();

// and

ArrayList.Erase(index);

К указателям динамически созданных объектов применим оператор delete - > delete hArray
 

Banana

Участник
Сообщения
892
Реакции
113
Скажите а можно каким-то образом Засунуть в ArrayList массив с строковыми данными?
0|"Привет"|"Пока"
1|"Елка"|"Ибрагим"

где 0 и 1 - индексы массива ArrayList.
 

JDW

Мы открываем бизнес
Сообщения
376
Реакции
325
Скажите а можно каким-то образом Засунуть в ArrayList массив с строковыми данными?
0|"Привет"|"Пока"
1|"Елка"|"Ибрагим"

где 0 и 1 - индексы массива ArrayList.
Можно создать один ArrayList, где будут храниться ArrayList со строками или же хранить DataPack . Считай двумерный массив получится 🙃
 

RusJJ

Доброе утро девачьки
Сообщения
2,582
Реакции
1,075
@Nekro, каво? А ты выделил место под ячейку?
 

Nekro

Терра инкогнита
Сообщения
4,025
Реакции
2,260
@Nekro, каво? А ты выделил место под ячейку?
C-подобный:
ArrayList hArray;

public void OnPluginStart()
{
    hArray = new ArrayList(ByteCountToCells(64));
   
    char sValue[512];
    sValue = "[****.ru] Вы пополнили свой баланс на [10] рублей";
   
    hArray.PushString(sValue);
   
    GetArrayString(hArray, 0, tt, sizeof(tt));
   
    PrintToChatAll("%s", tt);
}


На фразе "на [1" обрывается текст,
 

Вложения

  • Screenshot_11.png
    Screenshot_11.png
    8.5 КБ · Просмотры: 39

DENFER

Пишу плагины за два биг тести и картошку фри..
Сообщения
260
Реакции
289
Вот этот момент меня интересует больше всего. Зачем ты обращаешься к переменой типа хендл по индексу?
1639319651005.png
 

Nekro

Терра инкогнита
Сообщения
4,025
Реакции
2,260
Сверху Снизу