У тебя наверняка где то запись повторная шла в массив после очистки
(так как я в логи выводил и массивы пустые были после такой очистки)
Вид для печати
Сначала не вник в предложенный вариант и решил, что тут идёт именно очищение нулевой строки (не заметил, что второй массив так же ссылается на enum).
Действительно, отчищаться будет.
Если кто-то не понимает почему, то тут всё просто. Отчищается он из-за того, что мы объявляем второй массив с тем же числом ячеек, при этом не заполнив его никакими значениями (следовательно, он заполнится нулями), а после приравниваем первый массив ко второму, из-за чего первый "перенимает" все значения второго (использование оператора "=" прокатит только в том случае, когда массивы либо одинаковые по размеру, либо второй массив меньше). Так как второй массив заполнен нулями, первый так же "обнулится".
Вот простой пример с локальным массивом
Я бы иPHP код:
new string[] = "Pro-Pawn";
static const NULL_string[sizeof(string)];
print(string);
string = NULL_string;
print(string);
print(string[3]);
предложил оформить как константу, дабы "случайно" не изменить в нём какие-либо данныеPHP код:
new NULL_PlayerInfo[pInfo] = {"noname", 50.0, 100};
Заметил, что способ с NULL_ может вызывать проблемы, связанные с перезаписью лишних ячеек памяти.
Имелась такая структура массивов:
Использовал я так:PHP код:
enum PlayerInterfaceParams {
PIP_TextDraw,
PIP_Visible,
}
enum PlayerInterface {
PI_Armour,
PI_Health,
PI_Info,
PI_LevelLineBackground,
PI_LevelLine,
PI_LevelLevel,
PI_LevelPlus,
PI_LevelXP,
PI_LevelXPPlus,
PI_MoneyBorder,
PI_MoneyBackground,
PI_MoneyMoney,
PI_MoneyPlus,
PI_WeaponSkill,
}
new
gPlayerInterface[MAX_PLAYERS][PlayerInterface][PlayerInterfaceParams],
NULL_gPlayerInterface[PlayerInterface][PlayerInterfaceParams];
И с таким кодом происходили разного рода проблемы, значения менялись и у другого игрока, например.PHP код:
public OnPlayerConnect(playerid)
{
gPlayerInterface[playerid] = NULL_gPlayerInterface;
TogglePlayerInterfaceVisibility(playerid, true, true);
return 1;
}
А с этим кодом всё работает нормально:
Так что вариант с NULL_ небезопасный, лучше его не использовать.PHP код:
public OnPlayerConnect(playerid)
{
for (new i = 0; i < sizeof(gPlayerInterface[]); i++) {
for (new j = 0; j < sizeof(gPlayerInterface[][]); j++) {
gPlayerInterface[playerid][PlayerInterface:i][PlayerInterfaceParams:j] = 0;
}
}
TogglePlayerInterfaceVisibility(playerid, true, true);
return 1;
}
Похоже на баг компилятора. Я взял код из поста выше, закомментировал все поля в PlayerInterface кроме одного PI_Armour (чтобы было проще смотреть на отладочный вывод) и добавил код для инициализации ячеек массива gPlayerInterface и отладочного вывода значений из него.
Вывод:
Как и было сказано, обнуляются ячейки не только для playerid, но и для следующих двух игроков. Что интересно, в gPlayerInterface[2][0][1] вместо 0 было записано значение 0x00000FAC - скорее всего, оно попало туда по ошибке из таблицы смещений от массива gPlayerInterface.
@ziggi, я сообщу об этом баге в репо компилятора, или ты сам?
Ок, https://github.com/pawn-lang/compiler/issues/388
Забыл сказать, проблема весьма специфическая и проявляется только когда в обоих массивах (т.е. и в массиве-источнике, и в приёмнике) есть 2 и более enum-измерения. Иными словами, если убрать у массивов последнее измерение
new gPlayerInterface[MAX_PLAYERS][PlayerInterface]; new const NULL_gPlayerInterface[PlayerInterface];
копирование будет происходить правильно, без перезаписи лишних ячеек.