Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 4 из 4
  1. #1
    Аватар для Seviel
    Пользователь

    Статус
    Оффлайн
    Регистрация
    23.12.2016
    Адрес
    Казахстан
    Сообщений
    148
    Репутация:
    26 ±

    auto_new_line - авто переход на новую строку.


    Название:
    auto_new_line

    Описание:
    Проставляет \n по возможности на ближайшем пробеле.

    Аргументы:
    • string - Массив со строкой в которой будет проставляться переходы
    • lenght_line - Количество символов в одной строке, по умолчанию 70
    • string_size - Размер строки, по умолчанию количество равно sizeof string



    Код:
     Код

    Код:
    stock auto_new_line(string[], const lenght_line = 70, const string_size = sizeof string)
    {
        new
            point = 0,
            len = strlen(string),
            check = 0;
    
        while(point < len - lenght_line)
        {
            for(new j = point; j < point + lenght_line; ++j)
            {
                if(string[j] == '\n')
                {
                    check = 1;
                    point = j + 1;
                    break;
                }
            }
            if(check == 0)
            {
                for(new j = point + lenght_line; j >= 0; --j)
                {
                    if(string[j] == ' ')
                    {
                        string[j] = '\n';
                        check = 1;
                        point = j;
                        break;
                    }
                }
            }
            if(check == 0)
            {
                strins(string, "\n", point + lenght_line, string_size);
                point = point + lenght_line + 1;
            }
            check = 0;
        }
        return 1;
    }


    Пример:
     Пример

    Код:
    public OnPlayerSpawn(playerid)
    {
        new string[450] = "\
            Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod \
            tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, \
            quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. \
            Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu \
            fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in \
            culpa qui officia deserunt mollit anim id est laborum.\
        ";
        auto_new_line(string, 70);
        ShowPlayerDialog(playerid, 0, DIALOG_STYLE_MSGBOX, "Lorem ipsum", string, "Ok", "");
        return 0;
    }



    Автор: knox

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

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

    UPD: Так же, судя по коду, вот в таком случае:
    PHP код:
    new string[] = "test\ntest";
    auto_new_line(string4); 
    Будет добавлен дополнительный перенос.
    Последний раз редактировалось DeimoS; 29.03.2019 в 07:45.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    23.12.2016
    Адрес
    Казахстан
    Сообщений
    148
    Репутация:
    26 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    И название странное (функции обычно в CamelCase оформляют).
    Название специально не по стилю выбрал, дабы сразу было ясно что не стандартно(Мне лично так удобнее понимать когда самописная, а когда стандартная).

    Цитата Сообщение от DeimoS Посмотреть сообщение
    UPD: Так же, судя по коду, вот в таком случае:
    PHP код:
    new string[] = "test\ntest";
    auto_new_line(string4); 
    Будет добавлен дополнительный перенос.
    Не будет, этим занимается 1 for.

    Цитата Сообщение от DeimoS Посмотреть сообщение
    Как минимум: и инициализация переменных внутри цикла, и вычисления в условии цикла, которые спокойно можно вынести за его пределы, дабы не проводить одну и ту же операцию каждый тик минорных циклов.
    Я не смог придумать более оптимального варианта это сделать.

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

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


    Цитата Сообщение от Seviel Посмотреть сообщение
    Не будет, этим занимается 1 for.
    Хмм, ну вот даже тебе скрин с тестом, раз самому лень проверять было.
      Открыть/закрыть

    Но это даже по коду видно, ибо когда ты ищешь "\n", ты не учитываешь, что символ переноса может стоять следующим после того количества символов, которые нужно отделять. Отсюда и два переноса вместо одного.


    Цитата Сообщение от Seviel Посмотреть сообщение
    Я не смог придумать более оптимального варианта это сделать.
    Ну так говорю же, убрать инициализацию переменных из циклов + значение "point + lenght_line" высчитывать при каждой итерации while (создать переменную, записать значение в неё и уже использовать переменную в циклах), а не каждую итерацию минорных циклов.

    - - - Добавлено - - -

    Как-то так:
      Открыть/закрыть
    1. stock auto_new_line(string[], const max_line_size = 70, const string_size = sizeof string)
    2. {
    3. new
    4. pos = 0,
    5. j,
    6. len = strlen(string),
    7. l = len - max_line_size,
    8. size_limit;
    9.  
    10. while(pos < l)
    11. {
    12. size_limit = pos + max_line_size + 1;
    13.  
    14. for(j = pos; j < size_limit; ++j)
    15. {
    16. if(string[j] == '\n')
    17. {
    18. pos = j + 1;
    19. goto __skip;
    20. }
    21. }
    22. size_limit -= 1;
    23. for(j = size_limit; j > -1; --j)
    24. {
    25. if(string[j] == ' ')
    26. {
    27. string[j] = '\n';
    28. pos = j;
    29. goto __skip;
    30. }
    31. }
    32.  
    33. strins(string, "\n", size_limit, string_size);
    34. pos = size_limit + 1;
    35. __skip:
    36. }
    37. return 1;
    38. }

    И то это, вероятно, не всё, что можно тут сделать.
    Последний раз редактировалось DeimoS; 29.03.2019 в 12:16.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

  6. Пользователь сказал cпасибо:
    Seviel (29.03.2019)
 

 

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

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

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

Ваши права

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