Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 2 1 2 ПоследняяПоследняя
Показано с 1 по 10 из 19
  1. #1
    Аватар для PawnoNoob
    Пользователь

    Статус
    Оффлайн
    Регистрация
    31.03.2016
    Сообщений
    257
    Репутация:
    3 ±

    Несколько вопросов (переменные, длина текста)

    Приветствую! Появилось несколько вопросов, на которые я (из-за малого опыта в данной сфере) дать ответа не могу.

    1. Длина текста в чате. Сразу скажу, что я знаю, что максимальная длина текста в чате равна 144 символам, но можно ли увеличить этот лимит? (самописную функцию какую-нибудь использовать, например).

    2. Переменные. Давно задаюсь вопросом: как лучше объявить переменную для текста? Одну глобальную или в каждой функции объявлять отдельно?
    Для примера:
    PHP код:
    new s_string[128], b_string[256]; // Глобальные переменные. 
    Или же так:
    PHP код:
    public test()
    {
    new 
    string[100];
    format(stringsizeof(string), "...", ...);
    ...
    return 
    true;

    Если создавать глобальные переменные, то как их лучше использовать?
    PHP код:
    format(s_stringsizeof(s_string), "...", ...); // С sizeof
    format(s_string50"...", ...); // Или выделять определённое кол-во ячеек? 

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

    Статус
    Оффлайн
    Регистрация
    06.03.2016
    Адрес
    Moscow
    Сообщений
    167
    Репутация:
    44 ±
    1. Нет
    2. Подвергну себя на лютые гонения, но скажу, что глобальную... Не знаю, почему все шумят, самп однопоточный, и в "стандартных случаях", лично я использую глобальный массив - за 2 года ни каких ошибок не заметил. Главное нормально использовать.... В теории правильнее использовать локальную переменную, но на практике - глобальную. Это моё мнение.
    p.s. DC в этом плане против и ругается...
    Последний раз редактировалось Nash_Brigers; 08.05.2017 в 18:29.
    Член сообщества Green Square.

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    1. Длина текста в чате не 144, а 128 символов. Именно столько можно ввести в строку чата.
      144 - это максимальное число символов, которые может вывести SendClientMessage(ToAll) за раз. Точнее, "144+1", если объявлять массив. А если ещё точнее - "MAX_CHATBUBBLE_LENGTH+1", дабы совместимость не потерять, в случае обновлений клиента и изменения лимитов.
      Обойти ограничение чата нельзя (ну, точнее, придётся правки в SA-MP вносить).
      А длинный текст можно вывести путём использования нескольких SendClientMessage(ToAll). Например:
        Открыть/закрыть
      PHP код:
      public OnPlayerCommandText(playeridcmdtext[])
      {
          if (
      strcmp("/test"cmdtexttrue) == 0)
          {
              new 
      text[] = "Длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный текст",
                  
      string[MAX_CHATBUBBLE_LENGTH+1],// Так как наш текст очень длинный, создадим своеобразный буфер, в который будем помещать куски текста, дабы сервер не завис
                  
      len strlen(text),// Узнаём размер нашего текста
                  
      repeats len/MAX_CHATBUBBLE_LENGTH;// Вычисляем насколько размер больше 144

              
      format(stringsizeof(string), text);    // Функцией формат поместим кусок текста в 144 символов из text в массив string
              
      SendClientMessage(playerid, -1string);// Выводим текст в чат
              
      if(repeats)// Если текст больше 144, запускаем цикл и выводим оставшиеся части
              
      {
                  for(new 
      1<= repeatsi++)
                  {
                      
      format(stringsizeof(string), text[MAX_CHATBUBBLE_LENGTH*i]);// Делаем то же самое, только теперь "отрезаем" текст не с нулевой ячейки, а с "144*номер_итерации". Таким образом мы выведем весь текст
                      
      SendClientMessage(playerid, -1string);
                  }
              }
              
      format(stringsizeof(string), "Длина текста: %d | Число сообщений: %d"lenrepeats+1);// Ну и ради интереса выведем полученн
              
      SendClientMessage(playerid, -1string);
              return 
      1;
          }
          return 
      0;



      А можно воспользоваться готовым решением

    2. На твоё усмотрение. Я предпочитаю использовать локальные переменные, дабы быть уверенным, что весь текст, с которым я работаю, будет целиком обработан.
      С технической точки разница будет лишь в том, что в случае с локальными переменными ты работаешь с уже выделенной памятью (стэком) и ничего более не выделяешь, а глобальная переменная займёт место в сегменте данных. Это нисколько не критично.
      Всё, в основном, упирается в удобство, ибо нужно будет постоянно помнить размер этого массива, дабы не забыть увеличит его в случае чего + теряется некая ясность в коде, ибо ты так сразу не сможешь понять, что раз вот тут у тебя объясляется массив, значит до этого никаких действий с данными не происходит.

    3. Всегда используй sizeof. От того, что ты укажешь значение меньше, количество ячеек в массиве не уменьшится. Просто ты укажешь функции на то, сколько символов из строки поместить в массив. То бишь:
      PHP код:
      new s_string[100];
      format(s_string5"123456789"); 
      В этой ситуации ты всё так же обращаешься к массиву, состоящему из 100 ячеек. Просто функция format обрежет текст "123456789", оставив лишь первые 5 символов.

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

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

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    31.03.2016
    Сообщений
    257
    Репутация:
    3 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    1. Длина текста в чате не 144, а 128 символов. Именно столько можно ввести в строку чата.
      144 - это максимальное число символов, которые может вывести SendClientMessage(ToAll) за раз. Точнее, "144+1", если объявлять массив. А если ещё точнее - "MAX_CHATBUBBLE_LENGTH+1", дабы совместимость не потерять, в случае обновлений клиента и изменения лимитов.
      Обойти ограничение чата нельзя (ну, точнее, придётся правки в SA-MP вносить).
      А длинный текст можно вывести путём использования нескольких SendClientMessage(ToAll). Например:
        Открыть/закрыть
      PHP код:
      public OnPlayerCommandText(playeridcmdtext[])
      {
          if (
      strcmp("/test"cmdtexttrue) == 0)
          {
              new 
      text[] = "Длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный-длинный текст",
                  
      string[MAX_CHATBUBBLE_LENGTH+1],// Так как наш текст очень длинный, создадим своеобразный буфер, в который будем помещать куски текста, дабы сервер не завис
                  
      len strlen(text),// Узнаём размер нашего текста
                  
      repeats len/MAX_CHATBUBBLE_LENGTH;// Вычисляем насколько размер больше 144

              
      format(stringsizeof(string), text);    // Функцией формат поместим кусок текста в 144 символов из text в массив string
              
      SendClientMessage(playerid, -1string);// Выводим текст в чат
              
      if(repeats)// Если текст больше 144, запускаем цикл и выводим оставшиеся части
              
      {
                  for(new 
      1<= repeatsi++)
                  {
                      
      format(stringsizeof(string), text[MAX_CHATBUBBLE_LENGTH*i]);// Делаем то же самое, только теперь "отрезаем" текст не с нулевой ячейки, а с "144*номер_итерации". Таким образом мы выведем весь текст
                      
      SendClientMessage(playerid, -1string);
                  }
              }
              
      format(stringsizeof(string), "Длина текста: %d | Число сообщений: %d"lenrepeats+1);// Ну и ради интереса выведем полученн
              
      SendClientMessage(playerid, -1string);
              return 
      1;
          }
          return 
      0;



      А можно воспользоваться готовым решением

    2. На твоё усмотрение. Я предпочитаю использовать локальные переменные, дабы быть уверенным, что весь текст, с которым я работаю, будет целиком обработан.
      С технической точки разница будет лишь в том, что в случае с локальными переменными ты работаешь с уже выделенной памятью (стэком) и ничего более не выделяешь, а глобальная переменная займёт место в сегменте данных. Это нисколько не критично.
      Всё, в основном, упирается в удобство, ибо нужно будет постоянно помнить размер этого массива, дабы не забыть увеличит его в случае чего + теряется некая ясность в коде, ибо ты так сразу не сможешь понять, что раз вот тут у тебя объясляется массив, значит до этого никаких действий с данными не происходит.

    3. Всегда используй sizeof. От того, что ты укажешь значение меньше, количество ячеек в массиве не уменьшится. Просто ты укажешь функции на то, сколько символов из строки поместить в массив. То бишь:
      PHP код:
      new s_string[100];
      format(s_string5"123456789"); 
      В этой ситуации ты всё так же обращаешься к массиву, состоящему из 100 ячеек. Просто функция format обрежет текст "123456789", оставив лишь первые 5 символов.

      Пользы от ручного указания в обычной ситуации нет никакой. А вот проблемы могут начаться, если ты вдруг решишь уменьшить размер массива, но число оставишь прежним (случится выход за пределы массива, если текст будет слишком длинный)
    То есть по-вашему лучше использовать локальные переменные с подсчётом размера форматируемой строки?

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

    Статус
    Оффлайн
    Регистрация
    02.04.2017
    Адрес
    Краснодар
    Сообщений
    83
    Репутация:
    20 ±
    Цитата Сообщение от PawnoNoob Посмотреть сообщение
    То есть по-вашему лучше использовать локальные переменные с подсчётом размера форматируемой строки?
    P.S. Размер маленьких строк можно считать вручную, либо использовать сервисы по подсчёту символов(в некоторых редакторах это уже предусмотрено). При работе с большИм кол-вом спецификаторов следует использовать метод, описываемый DC. В принципе, можно всё вручную считать, но дорого ли такому человеку время?

  8. Пользователь сказал cпасибо:
    PawnoNoob (08.05.2017)
  9. #6
    Аватар для DeimoS
    Модератор?

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

    Цитата Сообщение от SooBad Посмотреть сообщение
    В принципе, можно всё вручную считать, но дорого ли такому человеку время?
    Меня всегда интересовал другой вопрос: куда спешат все те, кто сокращают имена нативок (а-ля: "format( -> f(" или "SendClientMessage -> SCM") и пользуются методами, подобными тому, что указан в статье, оправдывая это экономией времени? Всегда пишу весь код без каких-либо непонятных сокращений и, вроде, не отстал от остальных во времени (или отстал?). Может я жизнь не понял и неправильно живу?
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

  10. Пользователь сказал cпасибо:
    PawnoNoob (08.05.2017)
  11. #7
    Аватар для PawnoNoob
    Пользователь

    Статус
    Оффлайн
    Регистрация
    31.03.2016
    Сообщений
    257
    Репутация:
    3 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Я использую локальные переменные и ручной (при помощи встроенной функции редактора) подсчёт. А метод, что указан в статье по ссылке, я считаю слишком громоздким и гораздо более времязатратным, если учесть, что 99% всех текстов в скриптах будут правится лишь однажды - при написании этого самого скрипта. Ну, в лучшем случае, ещё пару раз. Поэтому не вижу смысла ради этого убивать читаемость кода (а она очень даже убивается) ради того, чтоб сэкономить время в ситуации, которая, скорее всего, никогда не настанет



    Меня всегда интересовал другой вопрос: куда спешат все те, кто сокращают имена нативок (а-ля: "format( -> f(" или "SendClientMessage -> SCM") и пользуются методами, подобными тому, что указан в статье, оправдывая это экономией времени? Всегда пишу весь код без каких-либо непонятных сокращений и, вроде, не отстал от остальных во времени (или отстал?). Может я жизнь не понял и неправильно живу?
    А что за редактор Вы используете? Atom (или я ошибаюсь?)

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

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

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

    Steve Pavlina

  13. Пользователь сказал cпасибо:
    PawnoNoob (08.05.2017)
  14. #9
    Аватар для PawnoNoob
    Пользователь

    Статус
    Оффлайн
    Регистрация
    31.03.2016
    Сообщений
    257
    Репутация:
    3 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Исключается ли возможность "краша" или каких-либо других проблем при редактировании и компиляции кода, если адаптировать редактор под pawn по Вашей инструкции? (Ну, например, кодировка (символы всякие))

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

    Статус
    Оффлайн
    Регистрация
    02.04.2017
    Адрес
    Краснодар
    Сообщений
    83
    Репутация:
    20 ±
    Цитата Сообщение от PawnoNoob Посмотреть сообщение
    Исключается ли возможность "краша" или каких-либо других проблем при редактировании и компиляции кода, если адаптировать редактор под pawn по Вашей инструкции? (Ну, например, кодировка (символы всякие))
    Насколько я знаю, "вылеты" происходят только у стандартного компилятора. Сейчас тоже перешёл на ST3(иногда юзаю NotePad) - проблем не наблюдается уже в течении пары месяцев.
    Насчёт кодировки - Unicode и ASCII точно поддерживает.

 

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

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

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

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

Ваши права

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