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

    Статус
    Оффлайн
    Регистрация
    04.01.2015
    Адрес
    Гомель, Беларусь
    Сообщений
    547
    Репутация:
    158 ±
    Цитата Сообщение от nickmate Посмотреть сообщение
    PHP код:
    new  string[(48 MAX_PLAYER_NAME 1) - 2]; 
    Неплохо, но зачем каждый раз считать символы в строке, если можно сделать так (способ от DC):

    PHP код:
    static const fmt_str[] = "[A] Администратор %s отказал в запросе о помощи";
    new 
    string[sizeof(fmt_str) + (-MAX_PLAYER_NAME)];
    format(stringsizeof(string), fmt_str/* Имя администратора */); 
    По большому счёту ты и так будешь вынужден каждый раз пересчитывать их заново, если количество спецификаторов поменяется.
    Не хотите постоянно проверять обновления моих скриптов?
    Подключите его последним, после всех остальных
    Nexius's Update Checker

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

    Статус
    Оффлайн
    Регистрация
    05.05.2018
    Сообщений
    0
    Репутация:
    0 ±
    Цитата Сообщение от Nexius_Tailer Посмотреть сообщение
    По большому счёту ты и так будешь вынужден каждый раз пересчитывать их заново, если количество спецификаторов поменяется.
    Я буду просто считать количество спецификаторов, а не количество символов в каждой строке. В любом случае, ты можешь использовать любой вариант, главное чтобы тебе было удобно. Я лишь показал один из способов, предложенным Daniel Cortez

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

    Статус
    Оффлайн
    Регистрация
    04.01.2015
    Адрес
    Гомель, Беларусь
    Сообщений
    547
    Репутация:
    158 ±
    Цитата Сообщение от nickmate Посмотреть сообщение
    Я буду просто считать количество спецификаторов, а не количество символов в каждой строке. В любом случае, ты можешь использовать любой вариант, главное чтобы тебе было удобно. Я лишь показал один из способов, предложенным Daniel Cortez
    Ну так при изменении строки нередко изменяется и количество спецификаторов, потому тебе и придётся всё равно всё пересчитывать, если нужно будет как-то более значимо изменить строку.
    Не хотите постоянно проверять обновления моих скриптов?
    Подключите его последним, после всех остальных
    Nexius's Update Checker

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    А для подсчёта символов в строке достаточно использовать нормальный редактор (то бишь, практически всё, кроме Pawno), в котором вшита функция подсчёта выделенных символов. От полученного значения отнять спецификаторы и получится размер строки без спецификаторов. На деле это будет быстрее, чем прописывать все эти "static const" и "sizeof(...)".

    Вариант от Кортеза хорош в очень длинных строках, которые, к тому же, часто изменяются. Хотя и в том случае это может вызвать ряд сложностей, например, при попытке изменить порядок спецификаторов (очень легко изменить не тот спецификатор/переменную, которую нужно было изменить, так как текст сообщения со спецификаторами и переменные будут находится в разных частях кода)
    Последний раз редактировалось DeimoS; 18.05.2018 в 18:11.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Хотя и в том случае это может вызвать ряд сложностей, например, при попытке изменить порядок спецификаторов (очень легко изменить не тот спецификатор/переменную, которую нужно было изменить, так как текст сообщения со спецификаторами и переменные будут находится в разных частях кода)
    Знаю, что немного поздно, но всё же спрошу: каким образом вышесказанное относится именно к моему методу подсчёта (насколько знаю, такому классу ошибок подвержены все известные ныне методы)? Не говоря уже о скромном замалчивании того факта, что при ручном подсчёте точно так же можно неправильно "сосчитать" размер не только спецификаторов, но и самой форматной строки - например, редактор кода показал "48", но ты случайно записал "46" (просто опечатка или показалось не то число - неважно). К слову, именно от этого типа ошибок и перестраховывает использование sizeof.

    P.S.: Ни в коем случае не пытаюсь добиться признания неправильным того или иного подхода к подсчёту размера строк - понятное дело, что однозначно правильного способа нет и всё зависит от индивидуального выбора каждым компромисса между скоростью написания кода и надёжностью. Тем не менее, хотелось бы видеть справедливое обсуждение всех плюсов и минусов, а не только доводы против одного метода и в пользу другого.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

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

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

    Речь идёт про такой вариант реализации:
    PHP код:
    static const fmt_str[] = "[A] Администратор %s отказал в запросе о помощи";
    new 
    string[sizeof(fmt_str) + (-MAX_PLAYER_NAME)];
    // Тут какой-либо другой код (например, определение максимального размера для массива, если мы имеем несколько static const, а не один)
    // Тут какой-либо другой код (то бишь, часто код очень нужный конкретно в данном месте, а не до/после массива/форматирования)
    // Тут какой-либо другой код 
    // Тут какой-либо другой код 
    // Тут какой-либо другой код 
    // Тут какой-либо другой код 
    // Тут какой-либо другой код 
    // Тут какой-либо другой код 
    // Тут какой-либо другой код 
    // Тут какой-либо другой код 
    // Тут какой-либо другой код 
    // Тут какой-либо другой код 
    // Тут какой-либо другой код 
    // Тут какой-либо другой код 
    // Тут какой-либо другой код 
    // Тут какой-либо другой код 
    // Тут какой-либо другой код 
    format(stringsizeof(string), fmt_str/* Имя администратора */); 
    Очень часто встречал такие реализации при использовании метода подсчёта с sizeof и если появится нужда изменить порядок спецификаторов, придётся совершать, как минимум, лишние движения глазами вверх/вниз (что, согласись, гораздо больше сбивает, чем если бы текст и спецификаторы были на одной строке).

    При этом, даже без какого-либо кода между массивом и форматированием, читаемость такого варианта на порядок ниже, ибо когда ты смотришь на format, тебе придётся каждый раз отделять переменные от массива для заполнения и массива с текстом
    PHP код:
    static const fmt_str[] = "[A] Администратор %s отказал в запросе о помощи";
    new 
    string[sizeof(fmt_str) + (-MAX_PLAYER_NAME)];
    format(stringsizeof(string), fmt_strname);  // Ты так сразу не увидишь, что в строку записывается всего 1 переменная, так как всё будет сливаться 
    В отличии от простого варианта, где всё подсвечивается редактором:
    PHP код:
    new string[45+ (-MAX_PLAYER_NAME)];
    format(stringsizeof(string), "[A] Администратор %s отказал в запросе о помощи"name);  // Тут уже сразу видно где находятся переменные, ибо они отделяются текстом от массива для заполнения 
    И к этому никак не привыкнуть, ибо практически в каждом случае форматирования у переменных будут уникальные имена разной длины, из-за чего нельзя просто "на автомате" пропустить несколько первых переменных.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    24.08.2015
    Адрес
    Ташкент
    Сообщений
    375
    Репутация:
    97 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    При этом, даже без какого-либо кода между массивом и форматированием, читаемость такого варианта на порядок ниже, ибо когда ты смотришь на format, тебе придётся каждый раз отделять переменные от массива для заполнения и массива с текстом
    PHP код:
    static const fmt_str[] = "[A] Администратор %s отказал в запросе о помощи";
    new 
    string[sizeof(fmt_str) + (-MAX_PLAYER_NAME)];
    format(stringsizeof(string), fmt_strname);  // Ты так сразу не увидишь, что в строку записывается всего 1 переменная, так как всё будет сливаться 
    В отличии от простого варианта, где всё подсвечивается редактором:
    PHP код:
    new string[45+ (-MAX_PLAYER_NAME)];
    format(stringsizeof(string), "[A] Администратор %s отказал в запросе о помощи"name);  // Тут уже сразу видно где находятся переменные, ибо они отделяются текстом от массива для заполнения 
    И к этому никак не привыкнуть, ибо практически в каждом случае форматирования у переменных будут уникальные имена разной длины, из-за чего нельзя просто "на автомате" пропустить несколько первых переменных.
    А как тогда (по твоему методу) считать длину таких строк:

    1. static const query_content[] =
    2. "SELECT " \
    3. "id," \
    4. "HEX(password_hash) as hash," \
    5. "HEX(password_salt) as salt " \
    6. "FROM "ACCOUNT_DATA_BASE_TABLE" " \
    7. "WHERE " \
    8. "name='%q'";


    Последний раз редактировалось Geebrox; 30.05.2018 в 02:45.
    Респект:
    @DeimoS
    @ziggi
    @Daniel_Cortez

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

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

    1. static const query_content[] =
    2. "SELECT " \
    3. "id," \
    4. "HEX(password_hash) as hash," \
    5. "HEX(password_salt) as salt " \
    6. "FROM "ACCOUNT_DATA_BASE_TABLE" " \
    7. "WHERE " \
    8. "name='%q'";


    Вручную? Точнее, при помощи редактора, выделяя текст каждой строки
      Открыть/закрыть

    Хотя, думаю, если поискать, можно найти готовый плагин для ST, который позволяет подсчитывать размер текста сразу для нескольких строк, а не только для одной. Меня просто и такой вариант вполне устраивает. Я просто копирую текст таких сообщений в отдельную вкладку и удаляю все переносы, дабы получилось что-то типа такого:
    PHP код:
    SELECT id,HEX(password_hash) as hash,HEX(password_salt) as salt FROM "ACCOUNT_DATA_BASE_TABLE" WHERE "name='%q' 
    На деле такой вариант всё равно будет быстрее, чем прописывание static const и sizeof (хотя и вариант с выделением каждой строки в отдельности будет быстр, если у тебя всё хорошо с математикой).
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    24.08.2015
    Адрес
    Ташкент
    Сообщений
    375
    Репутация:
    97 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    На деле такой вариант всё равно будет быстрее, чем прописывание static const и sizeof
    Да брось , пресчитывать каждую строчку потом в голове ещё сумировать всё это, убирать лишние или делители пробелы между строками, если есть ещё и константы то посомтреть содержимое константы и потом её длину тоже добалять ко всему полученному в голове и т. д. и т. п. Серьезно думаешь, что это быстрее, чем просто прописать sizeof? Это все действии не учитывая ещё и изменение в будущем. Например ты понял, что не правильно написал 1 букву в запросе после того как всё это ели просчитал, и....
    Последний раз редактировалось Geebrox; 31.05.2018 в 03:39.
    Респект:
    @DeimoS
    @ziggi
    @Daniel_Cortez

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Geebrox Посмотреть сообщение
    Да брось , пресчитывать каждую строчку потом в голове ещё сумировать всё это, убирать лишние или делители пробелы между строками, если есть ещё и константы то посомтреть содержимое константы и потом её длину тоже добалять ко всему полученному в голове и т. д. и т. п. Серьезно думаешь, что это быстрее, чем просто прописать sizeof? Это все действии не учитывая ещё и изменение в будущем. Например ты понял, что не правильно написал 1 букву в запросе после того как всё это ели просчитал, и....
    Именно, это будет быстрее. Ты забываешь, что прописать нужно не только sizeof, но ещё и static const + составить формулу со всеми вычетами заполнителей (когда я это могу сделать прямо в момент выделения текста, пропуская лишнее) + прописать в format вызов массива static const. К тому же, размер контакнт нужно будет смотреть и в случае использования static const.

    Да и с чего ты решил, что обязательно всё нужно считать в уме? Как я сказал, можно легко найти плагин на любой вкус. Вот, например, поставил первый попавшийся (называется "Word Count"), который считает весь выделенный текст
      Открыть/закрыть

    И это при том, что изначально плагин заточен не на подсчёт символов, а на автоматический подсчёт слов. Так что я уверен, что, при желании, можно найти плагин, который позволит гораздо удобнее рассчитывать размер сразу для всего выделенного текста, раз тебе так сложно в голове складывать, в большинстве своём, простые числа.

    Вариант со static const будет лидировать только в том случае, когда сама строка оформлена крайне ужасно. А-ля:
    PHP код:
    static const query_content[] =
            
    "SELECT "
                "id,"
                "HEX(password_hash) as hash,"
                "id,"
                "HEX(password_hash) as hash,"
                "id,"
                "HEX(password_hash) as hash,"
                "id,"
                "HEX(password_hash) as hash,"
                "id,"
                "HEX(password_hash) as hash,"
                "id,"
                "HEX(password_hash) as hash,"
                "id,"
                "HEX(password_hash) as hash,"
                "id,"
                "HEX(password_hash) as hash,"
                "id,"
                "HEX(password_hash) as hash,"
                "id,"
                "HEX(password_hash) as hash,"
                "id,"
                "HEX(password_hash) as hash,"
                "id,"
                "HEX(password_hash) as hash,"
                "id,"
                "HEX(password_hash) as hash,"
                "id,"
                "HEX(password_hash) as hash,"
                "id,"
                "HEX(password_hash) as hash,"
                "HEX(password_salt) as salt "
            "FROM "
    ACCOUNT_DATA_BASE_TABLE" "
            "WHERE "
                "name='%q'"

    Вот в таких случаях действительно может быть быстрее прописать static const (если формула окажется не очень запутанной и не придётся тратить дополнительное время на перепроверку того, правильные ли ты значения прописал для того или иного заполнителя. То бишь, как раз тут в силу вступает та ситуация, которую я описал пару постов назад для Кортеза). В остальных случаях "ручной" подсчёт будет в разы быстрее и, в итоге, позволит коду остаться читабельнее/компактнее (хотя даже в этом случае можно придумать варианты быстрого перерасчёта размера в случае изменения строки. Было бы желание).


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


    В общем, не стоит думать, что я тут просто так говорю обо всём этом. Я пытался пользоваться вариантом от Кортеза и даже работал с ним несколько месяцев. Но опыт показал, что в большинстве случаев такой вариант лишь отнимает кучу времени и бессмысленно раздувает код, не принося, при этом, пользы, ибо строка, в итоге, и не меняется никогда больше. А все твои "вот если строку изменить!...." - это обычное надумывание положительных моментов, для которых я так же могу придумать десяток отрицательных
    Последний раз редактировалось DeimoS; 31.05.2018 в 09:21.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

 

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

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

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

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

Ваши права

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