Контакты Поиск

[ вход ]
[ последние сообщения ]

  • Страница 1 из 1
  • 1
Форум » SourceMod >> CS:Source >> CSGO » Уроки SourceMod (SourcePawn) Скриптинга » adt_stack.inc - стек (CreateStack)
adt_stack.inc - стек (CreateStack)
_wS_ Дата: Вторник, 23.10.2012, 09:01:33 | Сообщение # 1
adt_stack.inc

Создает стек структуры (последним пришел, первым ушел). Есть только два типа действия: добавление элемента (Push) и его удаление (Pop). Удалить можно только последний элемент, т.е. удаление происходит только с конца.

Handle:CreateStack(blocksize=1);

Код
Создаёт пустую стек структуру.

blocksize - количество ячеек для каждого элемента list[][X].
Если вы хотите хранить в стеке строки или массивы, то размер нужно сделать побольше.

PushStackCell(Handle:stack, any:value);

Код
Помещает значение (int, float, Handle, byte) в конец стека (добавляется новый индекс). Это может безопасно использоваться, даже если стек имеет размер блока больше 1.

PushStackString(Handle:stack, const String:value[]); - добавляет строку в конец стека
PushStackArray(Handle:stack, const any:values[], size=-1); - массив

bool:PopStackCell(Handle:stack, &any:value, block=0, bool:asChar=false);

Код
Последний элемент стека удаляется, а его значение записывается в any:value (вашу переменную).
При этом размер стека уменьшается (-1 индекс).

bool:PopStackString(Handle:stack, String:buffer[], maxlength, &written=0); - извлечь строку
bool:PopStackArray(Handle:stack, any:buffer[], size=-1); - массив

bool:IsStackEmpty(Handle:stack); - вернет true, если стек пуст (нет элементов)
PopStack(Handle:stack) - это просто удаляет элемент с конца стека, не возвращая его значение

Код для теста:

Код
public OnPluginStart()
{
     new Handle:st = CreateStack(1);

     PrintToServer("Stack empty: %d", IsStackEmpty(st));
     PushStackCell(st, 1);
     PushStackCell(st, 3);
     PushStackCell(st, 5);
     PrintToServer("Stack empty: %d", IsStackEmpty(st));

     decl value;
     while (PopStackCell(st, value))
     {
         PrintToServer("value: %d", value);
     }

     PrintToServer("Stack empty: %d", IsStackEmpty(st));
}

Результат:

Код
Stack empty: 1
Stack empty: 0
value: 5
value: 3
value: 1
Stack empty: 1

Если бы добавили PopStack(st); перед decl value; (выше), то показало бы это:

Код
value: 3
value: 1

// 5 - было удалено
 
Naykon Дата: Вторник, 03.06.2014, 09:45:08 | Сообщение # 2
Сообщений: 439
Репутация: -4 [ +/- ]
Можно небольшой пример стека типа FIFO (первый пришел первый ушел..) или как "уходить" элементам с конца (1,3,5) - это один из вариантов решения))
 
tolik1231 Дата: Воскресенье, 13.06.2021, 15:37:14 | Сообщение # 3
Сообщений: 71
Репутация: -1 [ +/- ]
Подскажите а
PopStackArray​
с Char (String) работает?

char crurrentpathvalues[2][75] = {"123", "321"};
PushStackArray(path[client], crurrentpathvalues, 2);

так сработает?
 
_wS_ Дата: Воскресенье, 13.06.2021, 23:23:54 | Сообщение # 4
Цитата tolik1231 ()
Подскажите а PopStackArray​ с Char (String) работает?

Нет, т.к. PushStackArray и PopStackArray принимают одномерный массив const any[] values.
А твой считается двумерным (кол-во строк и размер каждой строки).
Работало, если бы они принимали двумерный: const any[][] values
Тест плг:

Код
public void OnPluginStart()
{    
    char s[][] = {"ab", "cd"};
    v(view_as<any>(s), sizeof(s));
}

void v(const any[][] a, int size)
{
    for (int i = 0; i < size; i++) {
        PrintToServer("%s", a[i]);
    }
}
 
Форум » SourceMod >> CS:Source >> CSGO » Уроки SourceMod (SourcePawn) Скриптинга » adt_stack.inc - стек (CreateStack)
  • Страница 1 из 1
  • 1
Поиск: