Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 2 из 8 ПерваяПервая 1 2 3 4 ... ПоследняяПоследняя
Показано с 11 по 20 из 75
  1. #11
    Аватар для stimorol
    Пользователь

    Статус
    Оффлайн
    Регистрация
    04.08.2015
    Сообщений
    55
    Репутация:
    1 ±
    DC, здравствуйте.

    Вот элементарная загрузка аккаунта:
      Открыть/закрыть

    PHP код:
    GetPlayerName(playeridPlayerInfo[playerid][pName], MAX_PLAYER_NAME);
    static 
    fmt_str[] = "SELECT * FROM `accounts` WHERE `Name` = '%s'";
    new 
    query_string[sizeof(fmt_str)-2+MAX_PLAYER_NAME+1];
    format(query_stringsizeof(query_string), fmt_strPlayerInfo[playerid][pName]);
    mysql_function_query(mysql_connect_idquery_stringtrue"CheckRegisterPlayer""i"playerid); 

    Как вы могли заметить в подсчёте я указал MAX_PLAYER_NAME+1, вот и вопрос. В каких случаях пишется просто MAX_PLAYER_NAME, а в каких MAX_PLAYER_NAME+1?

  2. #12
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Цитата Сообщение от stimorol Посмотреть сообщение
    DC, здравствуйте.

    Вот элементарная загрузка аккаунта:
      Открыть/закрыть

    PHP код:
    GetPlayerName(playeridPlayerInfo[playerid][pName], MAX_PLAYER_NAME);
    static 
    fmt_str[] = "SELECT * FROM `accounts` WHERE `Name` = '%s'";
    new 
    query_string[sizeof(fmt_str)-2+MAX_PLAYER_NAME+1];
    format(query_stringsizeof(query_string), fmt_strPlayerInfo[playerid][pName]);
    mysql_function_query(mysql_connect_idquery_stringtrue"CheckRegisterPlayer""i"playerid); 

    Как вы могли заметить в подсчёте я указал MAX_PLAYER_NAME+1, вот и вопрос. В каких случаях пишется просто MAX_PLAYER_NAME, а в каких MAX_PLAYER_NAME+1?
    MAX_PLAYER_NAME не причём, т.к. к общему размеру массива прибавляем плюс 1 (т.е. ещё одну ячейку) для нулевого символа (нужен для того, чтобы разъединять строки в памяти).

  3. Пользователь сказал cпасибо:
    stimorol (28.03.2016)
  4. #13
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от stimorol Посмотреть сообщение
    DC, здравствуйте.

    Вот элементарная загрузка аккаунта:
      Открыть/закрыть

    PHP код:
    GetPlayerName(playeridPlayerInfo[playerid][pName], MAX_PLAYER_NAME);
    static 
    fmt_str[] = "SELECT * FROM `accounts` WHERE `Name` = '%s'";
    new 
    query_string[sizeof(fmt_str)-2+MAX_PLAYER_NAME+1];
    format(query_stringsizeof(query_string), fmt_strPlayerInfo[playerid][pName]);
    mysql_function_query(mysql_connect_idquery_stringtrue"CheckRegisterPlayer""i"playerid); 

    Как вы могли заметить в подсчёте я указал 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. Заранее прошу прощения, если где-то повторяюсь. Немного плыву и трудно сформулировать мысль :с
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  5. Пользователь сказал cпасибо:
    stimorol (28.03.2016)
  6. #14
    Аватар для stimorol
    Пользователь

    Статус
    Оффлайн
    Регистрация
    04.08.2015
    Сообщений
    55
    Репутация:
    1 ±
    И ещё один вопрос. В каких случаях используется static const, а в каких просто static?

  7. #15
    Аватар для BadPawn
    Пользователь

    Статус
    Оффлайн
    Регистрация
    15.01.2016
    Адрес
    Приморье, Спасск-Дальний
    Сообщений
    165
    Репутация:
    7 ±

  8. #16
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Добавил пример #4, в котором показано форматирование с 2 и более строковыми аргументами.



    Цитата Сообщение от VVWVV Посмотреть сообщение
    MAX_PLAYER_NAME не причём, т.к. к общему размеру массива прибавляем плюс 1 (т.е. ещё одну ячейку) для нулевого символа (нужен для того, чтобы разъединять строки в памяти).
    Наиболее точной здесь будет формулировка "для обозначения окончания строки".


    Цитата Сообщение от DeimoS Посмотреть сообщение
    Только не стоит забывать, что игрок при входе может ввести только ник длинною в 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. Заранее прошу прощения, если где-то повторяюсь. Немного плыву и трудно сформулировать мысль :с
    Это недокументированное свойство и для того значения даже нет константы. Мало того, нет даже гарантии, что оно изменится вместе с MAX_PLAYER_NAME в будущей версии SA:MP.
    По сути то, что ты предлагаешь - точно такое же зло, как использовать 24 вместо MAX_PLAYER_NAME: всё будет работать, но только до поры, до времени.


    Цитата Сообщение от stimorol Посмотреть сообщение
    DC, здравствуйте.

    Вот элементарная загрузка аккаунта:
      Открыть/закрыть

    PHP код:
    GetPlayerName(playeridPlayerInfo[playerid][pName], MAX_PLAYER_NAME);
    static 
    fmt_str[] = "SELECT * FROM `accounts` WHERE `Name` = '%s'";
    new 
    query_string[sizeof(fmt_str)-2+MAX_PLAYER_NAME+1];
    format(query_stringsizeof(query_string), fmt_strPlayerInfo[playerid][pName]);
    mysql_function_query(mysql_connect_idquery_stringtrue"CheckRegisterPlayer""i"playerid); 

    Как вы могли заметить в подсчёте я указал MAX_PLAYER_NAME+1, вот и вопрос. В каких случаях пишется просто MAX_PLAYER_NAME, а в каких MAX_PLAYER_NAME+1?
    Проверьте 4-й пример, там этот вопрос разжёван.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  9. #17
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Это недокументированное свойство и для того значения даже нет константы.
    Так я и предлагаю её создать самостоятельно, дабы, в случае изменений со стороны мультиплеера, внести всего 1 изменение.


    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Мало того, нет даже гарантии, что оно изменится вместе с MAX_PLAYER_NAME в будущей версии SA:MP.
    Как и нет гарантий того, что оно не изменится.

    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    По сути то, что ты предлагаешь - точно такое же зло, как использовать 24 вместо MAX_PLAYER_NAME: всё будет работать, но только до поры, до времени.
    Почему же? Как я уже сказал и выше, и в том сообщении - под такое значение можно объявить константу и, при любых изменениях со стороны клиента, вносить изменения в эту константу
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  10. #18
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Так я и предлагаю её создать самостоятельно, дабы, в случае изменений со стороны мультиплеера, внести всего 1 изменение.

    Как и нет гарантий того, что оно не изменится.

    Почему же? Как я уже сказал и выше, и в том сообщении - под такое значение можно объявить константу и, при любых изменениях со стороны клиента, вносить изменения в эту константу
    Можно, но тем не менее, придётся добавлять большое количество констант с проверками, дабы узнать об изменении и обновлении версии. Также есть доля вероятности, что последние 4 ячейки все-таки будут заняты какими-то значениями, и вы получите выход за пределы массива (только в некоторых случаях). А также вы можете просто забыть про данную константу (например, не ввести новое значение).
    Последний раз редактировалось VVWVV; 29.03.2016 в 16:13.

  11. #19
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от VVWVV Посмотреть сообщение
    Можно, но тем не менее, придётся добавлять большое количество констант с проверками, дабы узнать об изменении и обновлении версии.
    Не думаю, что Куй вдруг изменит макрос MAX_PLAYER_NAME и не сообщит об этом. Да и "большое кол-во проверок" будет выглядеть так, если я правильно тебя понял:
    PHP код:
    #if MAX_PLAYER_NAME != 24
        #error Macro MAX_PLAYER_NAME is not equal to 24
    #endif 
    Цитата Сообщение от VVWVV Посмотреть сообщение
    Также есть доля вероятности, что последние 4 ячейки все-таки будут заняты какими-то значениями, и вы получите выход за пределы массива (только в некоторых случаях).
    Если все действия над ником совершать с учётом того, что ник равен не больше 20 символов, то никак не может получится выход за пределы массива. Если уж это случится - виной всему кривые руки скриптера, а не предложенный мною вариант (ну или тогда давайте всю вину за все случаи самоубийства, связанные с оружием, переложим на производителей этого оружия, а не на тех идиотов, кто совершил самоубийство)

    Цитата Сообщение от VVWVV Посмотреть сообщение
    А также вы можете просто забыть про данную константу (например, не ввести новое значение).
    Опять же, это чисто человеческий фактор и точно так же можно сказать про эту тему с подсчётом: вы можете просто неправильно составить формулу для подсчёта числа символов и выделите больше/меньше нужного.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  12. #20
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Не думаю, что Куй вдруг изменит макрос MAX_PLAYER_NAME и не сообщит об этом. Да и "большое кол-во проверок" будет выглядеть так, если я правильно тебя понял:
    PHP код:
    #if MAX_PLAYER_NAME != 24
        #error Macro MAX_PLAYER_NAME is not equal to 24
    #endif 

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



    Опять же, это чисто человеческий фактор и точно так же можно сказать про эту тему с подсчётом: вы можете просто неправильно составить формулу для подсчёта числа символов и выделите больше/меньше нужного.
    Хотя да, всему виной могут послужить "кривые" руки скриптера.
    Для большего удобства лучше сделать так:
    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) 

 

 
Страница 2 из 8 ПерваяПервая 1 2 3 4 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •