[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Форум » Уроки SourceMod (SourcePawn) Скриптинга » adt_stack.inc - стек (CreateStack) (Взято с world-source.ru)
adt_stack.inc - стек (CreateStack)
rootДата: Воскресенье, 03.02.2013, 00:29 | Сообщение # 1
Генералиссимус
Группа: Администраторы
Сообщений: 561
Статус: Offline
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 - было удалено
 
Форум » Форум » Уроки SourceMod (SourcePawn) Скриптинга » adt_stack.inc - стек (CreateStack) (Взято с world-source.ru)
  • Страница 1 из 1
  • 1
Поиск: