DC, здравствуйте.
Вот элементарная загрузка аккаунта:
Как вы могли заметить в подсчёте я указал MAX_PLAYER_NAME+1, вот и вопрос. В каких случаях пишется просто MAX_PLAYER_NAME, а в каких MAX_PLAYER_NAME+1?
Вид для печати
Только не стоит забывать, что игрок при входе может ввести только ник длинною в 20 символов (MAX_PLAYER_NAME является числом "24", где 20 символов под ник для игрока и ещё 4 символа для того, чтоб изменить ник со стороны сервера, добавив какой-то префикс (например, "AFK") даже если у игрока ник равен 20 символам). Следовательно, выделять "MAX_PLAYER_NAME+1" имеет смысл только тогда, когда в твоём моде присутствует код смены ника с добавлением какого-либо префикса (то бишь, ник игрока может быть больше 20 символов только благодаря SetPlayerName => если SetPlayerName вообще не используется, либо ты сразу делаешь проверку на то, что новый ник не больше 20 символов, то и выделять 25 ячеек бессмысленно). Во всех остальных случаях достаточно выделить "MAX_PLAYER_NAME-3" или же "MAX_PLAYER_NAME-4+1" (-4 ячейки, которые выделены для ника с сервера и + 1 ячейка для нуль-символа). А лучше сделать какой-то свой макрос, где уже указывать число, которому равно число символов для нужды сервера (те самые 4 символа), ибо вполне возможно, что в будущем это число может измениться разработчиками и тогда придётся перелопачивать весь мод вручную.
P.S. Заранее прошу прощения, если где-то повторяюсь. Немного плыву и трудно сформулировать мысль :с
И ещё один вопрос. В каких случаях используется static const, а в каких просто static?
Добавил пример #4, в котором показано форматирование с 2 и более строковыми аргументами.
Наиболее точной здесь будет формулировка "для обозначения окончания строки".
Это недокументированное свойство и для того значения даже нет константы. Мало того, нет даже гарантии, что оно изменится вместе с MAX_PLAYER_NAME в будущей версии SA:MP.
По сути то, что ты предлагаешь - точно такое же зло, как использовать 24 вместо MAX_PLAYER_NAME: всё будет работать, но только до поры, до времени.
Проверьте 4-й пример, там этот вопрос разжёван.
Так я и предлагаю её создать самостоятельно, дабы, в случае изменений со стороны мультиплеера, внести всего 1 изменение.
Как и нет гарантий того, что оно не изменится.
Почему же? Как я уже сказал и выше, и в том сообщении - под такое значение можно объявить константу и, при любых изменениях со стороны клиента, вносить изменения в эту константу
Можно, но тем не менее, придётся добавлять большое количество констант с проверками, дабы узнать об изменении и обновлении версии. Также есть доля вероятности, что последние 4 ячейки все-таки будут заняты какими-то значениями, и вы получите выход за пределы массива (только в некоторых случаях). А также вы можете просто забыть про данную константу (например, не ввести новое значение).
Не думаю, что Куй вдруг изменит макрос MAX_PLAYER_NAME и не сообщит об этом. Да и "большое кол-во проверок" будет выглядеть так, если я правильно тебя понял:
Если все действия над ником совершать с учётом того, что ник равен не больше 20 символов, то никак не может получится выход за пределы массива. Если уж это случится - виной всему кривые руки скриптера, а не предложенный мною вариант (ну или тогда давайте всю вину за все случаи самоубийства, связанные с оружием, переложим на производителей этого оружия, а не на тех идиотов, кто совершил самоубийство)PHP код:
#if MAX_PLAYER_NAME != 24
#error Macro MAX_PLAYER_NAME is not equal to 24
#endif
Опять же, это чисто человеческий фактор и точно так же можно сказать про эту тему с подсчётом: вы можете просто неправильно составить формулу для подсчёта числа символов и выделите больше/меньше нужного.
Хотя да, всему виной могут послужить "кривые" руки скриптера.
Для большего удобства лучше сделать так:
PHP код:
#define SUB_MAX_PLAYER_NAME (4)
#define C_MAX_PLAYER_NAME (MAX_PLAYER_NAME - SUB_MAX_PLAYER_NAME)
#assert ((C_MAX_PLAYER_NAME + SUM_MAX_PLAYER_NAME) == MAX_PLAYER_NAME)