Форум Pawn-Wiki.Ru - Воплоти мечту в реальность!: Зачем нужно использовать обнуление в массивах - Форум Pawn-Wiki.Ru - Воплоти мечту в реальность!

Перейти к содержимому

Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

[ Урок ]
Зачем нужно использовать обнуление в массивах
Оценка: -----

#1
Пользователь офлайн   Oleg_Petrow 

  • Олежка
  • Вставить ник
  • Раскрыть информацию
У всех серверов есть массив игрока. Лёгкий этому пример:
enum pInfo:
{
      pMoney, // Пусть это будет отвечать за деньги игрока
      pWarns   // А это за варны игрока
}
new PlayerInfo[MAX_PLAYERS][pInfo];


Вот лёгкий пример. Но я во многих модах встречал, что ничего не обнулялось и все жаловались, типо откуда варны и т.п. Допустим у нас нет загрузки аккаунта.
PlayerInfo - идёт массив с размером 1000. То есть если игрок будет под ID 0, то pInfo будет записываться в PlayerInfo[0]. Если этот игрок потом выйдет (а у нас допустил при выходе нет обнуления), то у нас всё равно останется в массиве эти значения, которые были при игроке. Например останется 1 варн и 30000 вирт. Да, игрока нет, но это всё равно останется.
А если зайдёт другой игрок под этим же ID? У него тоже всё это будет. Будет 1 варн и 30000 вирт. Вот именно для этого и нужно обнулять все значения, которые занесены в массивы игроков.

Если мы просто создали переменную, без enum:
new moneys[MAX_PLAYERS];

то у нас всё равно размер 1000.

MAX_PLAYER - это задефайненный косарь.
5

#2
Пользователь офлайн   Витёк 

  • Banned
  • Вставить ник
  • Раскрыть информацию
спс теперь я понял нафига обнулять :biggrin:
+ твой

#3
Пользователь офлайн   .evoxxx 

  • Liberty Inc.
  • Вставить ник
  • Раскрыть информацию
Решение то?
for(new pInfo:e; e < pInfo; ++e) PlayerInfo[playerid][e] = 0;

0

#4
Пользователь офлайн   Oleg_Petrow 

  • Олежка
  • Вставить ник
  • Раскрыть информацию
Пхчи
0

#5
Пользователь офлайн   m1n1vv 

  • Эксперт
  • Вставить ник
  • Раскрыть информацию
А разве данные не по новой загружаются?
0

#6
Пользователь офлайн   PUPER 

  • Banned
  • Вставить ник
  • Раскрыть информацию
Без вопросов +! Дам завтра :laugh:

#7
Пользователь офлайн   Oleg_Petrow 

  • Олежка
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияm1n1vv (14 Октябрь 2015 - 22:30) писал:

А разве данные не по новой загружаются?

Если идёт загрузка аккаунтов, то по новой, но я про переменные, которые не используются при загрузке. Например, игрок телепортировался, переменной присвоилось значение 1, типо
tp[playerid] = 1;

Дальше этот игрок вышел, зашёл следующий, и так совпало, что ID остался прежнего игрока. А значение переменной всё равно осталось 1, а не было 0, как при задаче массива.
0

#8
Пользователь офлайн   killkot1 

  • Прохожий
  • Вставить ник
  • Раскрыть информацию
Не понял, а как обнулять то? :blink:
0

#9
Пользователь офлайн   punkochel 

  • Новичок
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияkillkot1 (23 Июнь 2019 - 12:35) писал:

Не понял, а как обнулять то? :blink:


Обновляешь при выходе игрока с сервера, к примеру:

new Warns[MAX_PLAYERS]; // варны игрока
new bool:GetPrizeDay[MAX_PLAYERS]; // Приз игрока

OnPlayerDisconnect(playerid, reason)
{
	Warns[playerid] = 0; // Если числовое значение
	GetPrizeDay[playerid] = false; // Если булевое (вещественное) значение
	return 1;
}


Более удобным, на мой взгляд, вариантом, будет, создать stock с обнулением переменных к примеру ResetPlayerVariable.

Сообщение отредактировал punkochel: 24 Июнь 2019 - 20:41

0

#10
Пользователь офлайн   DeimoS 

  • Evil Scripter
  • Вставить ник
  • Раскрыть информацию
Для массивов, которые часто обновляются или в одной из мер которого указан enum с большим количеством членов перечисления, можно использовать такой трюк:
enum e_ENUM_ARRAY_TEST
{
    // ...
};
new Array[MAX_PLAYERS][e_ENUM_ARRAY_TEST];
new const NULL_Array[e_ENUM_ARRAY_TEST];

// И где нужно обнулить:
Array[playerid] = NULL_Array;


Ещё пример с предустановкой данных
new Array[5][500] = 
{
    "Тестовая строка 1",
    "Тестовая строка 2",
    "Тестовая строка 3",
    "Тестовая строка 4",
    "Тестовая строка 5",
};
new const NULL_Array[5][500] = 
{
    "Тестовая строка 1",
    "Тестовая строка 2",
    "Тестовая строка 3",
    "Тестовая строка 4",
    "Тестовая строка 5",
};

// И где нужно обнулить:
Array = NULL_Array;


И такой же пример, но с enum и разными типами данных:
enum e_ENUM_ARRAY_TEST
{
    Float:var_float,
    var_int_1,
    str[30],
    var_int_2,
};
new Array[MAX_PLAYERS][e_ENUM_ARRAY_TEST];
new const NULL_Array[e_ENUM_ARRAY_TEST] = 
{
    0.0,
    15,
    "Hello, World!",
    INVALID_PLAYER_ID
};

// И где нужно обнулить:
Array[playerid] = NULL_Array;// В массив запишутся те значения, которые мы перечислили выше


То бишь, мы просто создаём массив-дубликат, который будет хранить нужные нам изначальные значения и из которого мы будем копировать их в основной массив. Это самый быстрый вариант обнуления массива, хоть и затратный по памяти (поэтому его и стоит использовать либо когда у вас большой объём данных (по типу массива с данными игрока), либо когда данные нужно часто обнулять).
"const" массиву-дубликату приписывается просто чтоб уберечься от случайной перезаписи данных.

Сообщение отредактировал DeimoS: 24 Июнь 2019 - 21:47

1

Поделиться темой:


Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей


Яндекс.Метрика