Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 10 из 10

Тема: static string!

  1. #1
    Аватар для X!X
    Пользователь

    Статус
    Оффлайн
    Регистрация
    13.06.2018
    Сообщений
    58
    Репутация:
    1 ±

    static string!

    Почему нельзя замутить так?
    Код HTML:
    static const string[] = "SELECT * FROM `accounts` WHERE `name` = '%s' LIMIT 1";
    new query[sizeof(string)+Player[playerid][Name]];
    выдает варнинги:
    Код HTML:
    error 008: must be a constant expression; assumed zero
    error 009: invalid array size (negative, zero or out of bounds)
    error 036: empty statement
    fatal error 107: too many error messages on one line
    А так если вместо Player[playerid][Name] поставить MAX_PLAYER_NAME, то без варнингов компилит
    Последний раз редактировалось X!X; 16.07.2018 в 22:49.

  2. #2
    Аватар для StevenH
    Пользователь

    Статус
    Оффлайн
    Регистрация
    13.10.2015
    Сообщений
    516
    Репутация:
    21 ±
    Потому что компилятор при компиляции сам рассчитывает размер переменной query. Сколько символов в Player[playerid][Name] компилятор не знает, поэтому и ошибка. Константа MAX_PLAYER_NAME имеет значение 24, поэтому это аналогично вот этому:
    1. new query[sizeof(string)+MAX_PLAYER_NAME];
    2. =
    3. new query[sizeof(string)+24];

  3. #3
    Аватар для X!X
    Пользователь

    Статус
    Оффлайн
    Регистрация
    13.06.2018
    Сообщений
    58
    Репутация:
    1 ±
    пасибо, закрыто

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Советую изучить самые основы языка (хотя бы то, что из себя представляют переменные/массивы), ибо то, что ты хотел сделать, не поддаётся какой-либо логике :)
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

  5. #5
    Аватар для Mavi
    Пользователь

    Статус
    Оффлайн
    Регистрация
    17.07.2018
    Сообщений
    3
    Репутация:
    0 ±
    Потому что в Pawn'e отсутствуют динамические массивы.

    Для будущего: В версиях 0.3e ( или не знаю уже ) и выше Kalcor изменил длину ника на 20 символов. Чтобы не тратить лишние ячейки, рекомендую делать так:

    1. #if defined MAX_PLAYER_NAME
    2. #undef MAX_PLAYER_NAME
    3. #endif
    4. #define MAX_PLAYER_NAME 20
    Последний раз редактировалось Mavi; 18.07.2018 в 13:09.

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

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

    Для будущего: В версиях 0.3e ( или не знаю уже ) и выше Kalcor изменил длину ника на 20 символов. Чтобы не тратить лишние ячейки, рекомендую делать так:

    1. #if defined MAX_PLAYER_NAME
    2. #undef MAX_PLAYER_NAME
    3. #else
    4. #define MAX_PLAYER_NAME 20
    5. #endif
    Эмм, ты, видимо, хотел сделать так:
    1. #if defined MAX_PLAYER_NAME
    2. #undef MAX_PLAYER_NAME
    3. #endif
    4. #define MAX_PLAYER_NAME 20

    Хотя для этого лучше создавать отдельный макрос, если в моде реализована система тегов, так как в игре ник действительно может быть до 24-ех символов (это сделано как раз для того, чтоб можно было различные теги добавлять даже тем игрокам, у кого ник 20 символов)
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    17.07.2018
    Сообщений
    3
    Репутация:
    0 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Эмм, ты, видимо, хотел сделать так:
    1. #if defined MAX_PLAYER_NAME
    2. #undef MAX_PLAYER_NAME
    3. #endif
    4. #define MAX_PLAYER_NAME 20

    Хотя для этого лучше создавать отдельный макрос, если в моде реализована система тегов, так как в игре ник действительно может быть до 24-ех символов (это сделано как раз для того, чтоб можно было различные теги добавлять даже тем игрокам, у кого ник 20 символов)
    Ой, да. Исправил, моя ошибка.
    Для тега лучше создавать отдельный макрос, потому что MAX_PLAYER_NAME больше 80% скриптеров используют как длина основного ника, без тега ( ну чтобы делать запросы к БД, сравнивать ник со строками и так далее ). Ну если ты конечно не сохраняешь тег и ник в 1 массиве.
    Последний раз редактировалось Mavi; 18.07.2018 в 13:25.

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Mavi Посмотреть сообщение
    Ой, да. Исправил, моя ошибка.
    Для тега лучше создавать отдельный макрос, потому что MAX_PLAYER_NAME больше 80% скриптеров используют как длина основного ника, без тега ( ну чтобы делать запросы к БД, сравнивать ник со строками и так далее ). Ну если ты конечно не сохраняешь тег и ник в 1 массиве.
    Эмм, то есть, ты предлагаешь стандартному макросу переделать значение на 20, а для 24-ех создать новый макрос?
    Это нелогично, как минимум, потому, что ты придёшь к тому же результату, только добавишь одно лишнее действие. Да ещё и код запутаешь, ибо если человек не будет знать, что ты переназначил макрос, то продолжит использовать его как раньше и будет ждать, что он хранит значение "24".
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

  9. #9
    Аватар для Mavi
    Пользователь

    Статус
    Оффлайн
    Регистрация
    17.07.2018
    Сообщений
    3
    Репутация:
    0 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Эмм, то есть, ты предлагаешь стандартному макросу переделать значение на 20, а для 24-ех создать новый макрос?
    Это нелогично, как минимум, потому, что ты придёшь к тому же результату, только добавишь одно лишнее действие. Да ещё и код запутаешь, ибо если человек не будет знать, что ты переназначил макрос, то продолжит использовать его как раньше и будет ждать, что он хранит значение "24".
    1. #define MAX_PLAYER_NAME (24)
    2. #define MAX_PLAYER_TAG (4)
    3.  
    4. enum pInfo
    5. {
    6. PlayerNameArray[MAX_PLAYER_NAME],
    7. PlayerTagArray[MAX_PLAYER_TAG]
    8. }
    9. new PlayerInfo[MAX_PLAYERS][pInfo];
    10. new query[45 + MAX_PLAYER_NAME + MAX_PLAYER_TAG];
    11. format(query, sizeof(query), "SELECT 1 FROM `accounts` WHERE `Name` = '%s' AND `Tag` = '%s'", PlayerInfo[playerid][PlayerNameArray], PlayerInfo[playerid][PlayerTagArray]);
    12. mysql_tquery (handle, query, "", "", playerid);


    1. #define MAX_PLAYER_NAME (20)
    2. #define MAX_PLAYER_TAG (4)
    3.  
    4. enum pInfo
    5. {
    6. PlayerNameArray[MAX_PLAYER_NAME],
    7. PlayerTagArray[MAX_PLAYER_TAG]
    8. }
    9. new PlayerInfo[MAX_PLAYERS][pInfo];
    10. new query[45 + MAX_PLAYER_NAME + MAX_PLAYER_TAG];
    11. format(query, sizeof(query), "SELECT 1 FROM `accounts` WHERE `Name` = '%s' AND `Tag` = '%s'", PlayerInfo[playerid][PlayerNameArray], PlayerInfo[playerid][PlayerTagArray]);
    12. mysql_tquery (handle, query, "", "", playerid);


    Констант MAX_PLAYER_TAG все равно используется независимо от значении MAX_PLAYER_NAME. На первом примере можно да не использовать MAX_TAG_NAME, но если с запроса уберем AND `Tag`, там останутся пустые 4 ячейки.
    Но другой способ тоже имеется ( new query[41 + MAX_PLAYER_NAME]; / new query[45 + MAX_PLAYER_NAME - 4]; )
    Тут не поспоришь, ты тоже прав по сути)
    Последний раз редактировалось Mavi; 18.07.2018 в 22:04.

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Эмм, я не предлагаю держать макрос со значением 4. Я предлагаю создать макрос со значением 20 и использовать его там, где 100% ник игрока не будет содержать тег (а если на сервере нет систем, которые изменяют ник через SetPlayerName, то и ник никогда не сможет быть больше 20 символов). То бишь, чтоб было два макроса: стандартный, на 24 символа, и наш, на 20 символов.

    Хотя на самом деле в этом нет особого смысла. Экономия 4-ех ячеек не скажется на работе сервера положительным образом. Точнее, это никак не проявится для игроков или даже на тестах. А вот проблем из-за этого можно набраться, если наставить макрос с 20-ю символами там, где этого не должно быть. Поэтому использовать подобную оптимизацию нужно сугубо с умом, понимая что вы делаете. Иначе лучше пожертвовать 4-мя ячейками, которые не сильно навредят вашему серверу
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

 

 

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

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

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

Ваши права

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