Сообщение от
Gecriq
Тогда следует что в двухмерном массиве
pInfo есть поля из перечисления
e_PLAYER_INFO где член
pPassword является массивов символов. И получается что нулевому индексу массива символов члена
pPassword мы присваиваем значение
EOS [End of String] что означает конец строки
\0. И получается что таким образом наш массив не содержит символов? Получается ли это следующим образом
[\0][...][\0]? Ведь по умолчанию массив строк автоматически заканчивается ячейкой которая хранит символ
\0.
Я же писал для чего сделано это обнуление :) По-сути, если обнулять переменную с паролем игрока при выходе, то это обнуление не нужно. Но я решил перестраховаться, ибо на моём веку люди ни раз решали, что им какой-то участок кода не нужен и просто его не вставляли (это я говорю сейчас о "RemovePlayerInfo" в "OnPlayerDisconnect". Если эту функцию не вставить (то бишь, не совершить обнуление), то случится баг, когда пароль игрока, который играл на твоём слоте до тебя, "склеится" с твоим паролем, что не есь хорошо).
Сообщение от
Gecriq
И получается что таким образом наш массив не содержит символов? Получается ли это следующим образом [\0][...][\0]? Ведь по умолчанию массив строк автоматически заканчивается ячейкой которая хранит символ \0.
Если в массиве, например, хранился мой ник, то бишь:
"[D][e][i][m][o][S][\0]"
и тут мы первую ячейку заменили на нуль-символ, весь остальной текст никуда не исчез из массива и остался находится в нём. Получится вот так:
"[\0][e][i][m][o][S][\0]"
Просто когда мы пытаемся вывести данные из массива в виде строки, сервер выводит всё, что находится до первого попавшегося нуль-символа, а так как в самой первой ячейке у нас и хранится этот самый нуль-символ, сервер посчитает, что строка пустая (точнее, он-то ничего не посчитает. Он просто исполнит команду, в которой указано, что он должен вывести все данные из массива, пока в одной из ячеек не окажется нуль-символа).
Вот пример того, как это всё работает:
PHP код:
new deimos[100] = "DeimoS";//Объявим массив и запишем в него строку
main()
{
printf("-%s", deimos);//Отобразим его, дабы удостоверится, что данные в нём есть
deimos[0] = '\0';//"Обнулим" его
printf("-%s", deimos);//Попробуем отобразить весь массив, начиная с нулевой ячейки
printf("-%s", deimos[1]);//А теперь пропустим нулевую ячейку, которую мы приравняли к нуль-символу, и выведем содержимое
}
Сообщение от
Gecriq
Так-же меня смутил такой подход к удобности применения ID диалогов. Не выделяем ли мы память таким образом?
Нет, ибо перечисление создаёт константы, которые уже и хранят наши ID. Константы эти не заносятся в память сервера, а хранятся в коде aka инструкциях для AMX машины
Открыть/закрыть Константы заносятся в память только в тех случаях, когда они используются как число ячеек при объявлении массивов. То бишь
PHP код:
const value = 100;
new string[value];
Равносильна такой записи
PHP код:
new const value = 100;
new string[value];
Сообщение от
Gecriq
И почему данный подход эффективней чем использование макроподстановок?
Ну, во-первых, такой метод не требует самостоятельного ввода ID для диалога. Просто ввёл имя и компилятор сам подсчитает для него ID.
Во-вторых, в случае, когда ты решишь удалить один из первых диалогов, а после него будут идти ещё 10 штук, тебе не придётся вручную менять ID всех последующих диалогов (хотя если ты не являешься педантом и тебя не напрягают такие вещи, то проблем с этим у тебя не будет. Но меня подобные вещи бесят :3)