• Страница 1 из 1
  • 1
Флаги
Дмитрий Дата: Понедельник, 03.11.2014, 23:08 | Сообщение # 1 | Сообщить о нерабочей теме


Аватар для Дмитрий

Флаги
Привет всем.

Рад представить вам мой очередной урок в области PAWN программирования.

Автором оргинала урока является Slice (пользователь sa-mp.com).
Doc_Slove его подает в новом свете.

Итак, приступим.

Вы можете использовать 32 переменные, которые могут принимать значения true или false в одной переменной.
Пользуясь методом, который я опишу ниже, вы не только бережёте размер стека, вы так же избавляетесь от беспорядка в коде.

Если вы будете использовать 100 переменных типа bool для каждого игрока (MAX_PLAYERS), то вы будете тратить 195 Кб памяти.
Однако, если вы будете использовать 4 массива с флагами, то вы затратите только 8 КБ.
Т.е выходит, что вы сэкономите 187 КБ, довольно не плохо, правда?

Для использования флагов, нужно их сначала объявить:
Код
enum Flags:(<<= 1)
{
     //Не забывайте устанавливать значение первой переменной флага на 1
     LOGGED = 1,
     SPAWNED
};

new Flags:playerFlags[MAX_PLAYERS];  


Вот и всё, теперь к махинациям:
[1] Узнать значение флага:
Код
playerFlags[playerid] & LOGGED; //Вернёт значение флага LOGGED  


[2] Установить всем флагам значение:
Код
playerFlags[playerid] = Flags:0; //Обнулит все флаги


[3] Установить значение флага на 1:
Код
playerFlags[playerid] |= LOGGED; //Установит значение флага LOGGED на 1


[4] Установить значение флага на 0:
Код
playerFlags[playerid] &= ~LOGGED; //Установит значение флага LOGGED на 0  


[5] Сменить значение флага на противоположное:
Код
playerFlags[playerid] ^= LOGGED; //Если LOGGED был равен 1, то станет 0 (и наоборот)  


На этом урок закончен, удачной экономии памяти.

P.S: Не используйте более 32 флагов в одном энуменаторе!

P.s.
Цитата
//Не забывайте устанавливать значение первой переменной флага на 1

вопрос: для чего именно устанавливать значение на 1?

Если не присваивать 1 флагу еденицу, то все остальные флаги будут со значением 0.

Однако:
Значение флага никак не изменится!

Т.е вы не устанавливаете тем самым значение всех флагов на 1.
Просто у первый флаг будет представлять из себя: 0b01
А второй: 0b010

Т.е на значение флага это не будет влиять никак


Цитата
Не много не понятно, как и что заменять. Мне бы хотя-бы пример привести и в каких случаях использовать.
А так урок вроде не чего.

Было:
Код
[PHP]enum PlayerInfo
{
   bool:Logged,
   bool:Spawned
}  

Код
new pInfo[MAX_PLAYERS][PlayerInfo];

Стало:
Код
enum Flags:(<<= 1)
{
     LOGGED = 1,
     SPAWNED
};

new Flags:playerFlags[MAX_PLAYERS];  


Использовать лучше во всех случаях, где у переменной может быть значения 1 или 0


From Russia With Love!
  • Страница 1 из 1
  • 1
Поиск: