Заказать Сервер Заказать Плагин Контакты Поиск

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

Страница 1 из 11
Форум » SourceMod - Counter Strike Source && CS GO » Уроки 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);

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

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

PushStackCell(Handle:stack, any:value);

Code
Помещает значение (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);

Code
Последний элемент стека удаляется, а его значение записывается в 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) - это просто удаляет элемент с конца стека, не возвращая его значение

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

Code
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));
}

Результат:

Code
Stack empty: 1
Stack empty: 0
value: 5
value: 3
value: 1
Stack empty: 1

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

Code
value: 3
value: 1

// 5 - было удалено
 
Naykon Дата: Вторник, 03.06.2014, 09:45:08 | Сообщение # 2
Сообщений: 439
Репутация: -5 [ +/- ]
Можно небольшой пример стека типа FIFO (первый пришел первый ушел..) или как "уходить" элементам с конца (1,3,5) - это один из вариантов решения))
 
Форум » SourceMod - Counter Strike Source && CS GO » Уроки SourceMod (SourcePawn) Скриптинга » adt_stack.inc - стек (CreateStack)
Страница 1 из 11
Поиск: