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

    Статус
    Оффлайн
    Регистрация
    01.09.2019
    Сообщений
    121
    Репутация:
    26 ±

    ulong (оператор #emit)

    Доброго времени суток. Хотелось бы узнать, как можно в ulong от VVWVV конвертировать строку в ulong? Там нет для этого функционала, но как можно написать аналог strval для ulong?

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

    Статус
    Оффлайн
    Регистрация
    09.08.2019
    Сообщений
    45
    Репутация:
    9 ±
    давно я не писал на pawn, попробую написать.

    Что-то такое должно получиться:
    1. stock ulong:ulong_strval(str[], bool:ispacked=false, off=0, size=sizeof str)
    2. {
    3. new ulong:result;
    4. new c;
    5. new pos=off;
    6. while ('0'<=(c=str[pos])<='9') {
    7. #emit load.s.pri result
    8. #emit const.alt 10
    9. #emit umul
    10. #emit push.pri
    11. #emit load.s.pri c
    12. #emit const.alt '0'
    13. #emit sub
    14. #emit pop.alt
    15. #emit add
    16. #emit stor.s.pri result
    17. pos++;
    18. }
    19. return result;
    20. }


    Это unsafe функция.

    DC. заметил, что ispacked подсвечивается в списке формальных аргументов?
    Последний раз редактировалось vvw; 09.04.2020 в 13:05.

  3. Пользователь сказал cпасибо:
    tnc (09.04.2020)
  4. #3
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2590 ±
    Во-первых, искренне не понимаю, откуда вообще взялось название "ulong". Если рассматривать это с позиции разработчика, знакомого как минимум с C/C++, слово "long" подразумевает тип данных большего размера, т.е. не 4 байта (размер ячейки), а 8. Здесь же тип "ulong" ограничен всё теми же 4 байтами и является просто чем-то вроде беззнакового типа данных ("чем-то вроде", потому что в Pawn нет типов данных как таковых - есть теги) и было бы логичнее назвать его "ucell" (т.е. "беззнаковая ячейка"; кстати, именно так этот тип данных и называется в исходниках Pawn). Впрочем, это так, небольшая придирка, на работе инклуда это не сказывается =)
    Да и вообще, это ничто на фоне других популярных инклудов/плагинов - взять, к примеру, небезызвестные плагины с нелепыми хайповыми названиями, начинающимися на "Pawn.*", как будто они являются частью проекта Pawn (т.е. наравне с компилятором, интерпретатором и стандартными библиотеками; не говоря уже о том, что это тянет на недобросовестное использование торговой марки "Pawn").

    Во-вторых,
    Цитата Сообщение от vvw Посмотреть сообщение
    1. ulong:ulong_strval(str[], bool:ispacked=false, off=0, size=sizeof str)
    если передаваемый в функцию массив используется только для чтения, его следует помечать как "const" (т.е. в данном случае - "const str[]").

    В-третьих,
    Цитата Сообщение от vvw Посмотреть сообщение
    1. new ulong:result;
    https://pro-pawn.ru/showthread.php?1...ng-210-%28-%29

    В-четвёртых, зачем нужен параметр "off", если функцию можно использовать так:
    Цитата Сообщение от vvw Посмотреть сообщение
    1. new ulong:result = ulong_strval(inputtext[4]);
    ?

    В-пятых, не используется параметр "size" (ты это имел в виду под "unsafe-функция"?), но он и не нужен - строка всё равно заканчивается нуль-символом, на котором выполнение цикла while прервётся, так что ситуация с OOB исключена. По этой же причине и у стандартной функции strval() нет параметра "size".

    В-шестых, параметр "ispacked" тоже не особо нужен, упакованность строки можно проверить и внутри самой функции.

    И, наконец, в-седьмых, с помощью оператора __emit вычитание кода символа "0" можно записать так:
    1. add.c (-'0')

    , т.е. без загрузки значения в ALT, благодаря чему не нужно лишний раз сохранять другое значение из PRI в стек.

    В итоге у меня получилась такая функция:
    1. stock ulong:ulong_strval(const str[])
    2. {
    3. new const bool:packed = (str[0] & ~0xFF != 0);
    4. new ulong:result = ulong:0;
    5. new pos = 0;
    6. new c;
    7. while ('0' <= (c = (packed ? str{pos} : str[pos])) <= '9') {
    8. __emit load.s.pri result;
    9. __emit const.alt 10;
    10. __emit umul;
    11. __emit move.alt;
    12. __emit load.s.pri c;
    13. __emit add.c (-'0');
    14. __emit add;
    15. __emit stor.s.pri result;
    16. pos++;
    17. }
    18. return result;
    19. }


    Цитата Сообщение от vvw Посмотреть сообщение
    DC. заметил, что ispacked подсвечивается в списке формальных аргументов?
    А что ты ожидал? =)
    Подсветка работает на простой замене текста, ибо полноценный анализ синтаксиса => неоправданная нагрузка на сервер (либо на клиент, если делать клиент-сайдом на js).
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  5. 2 пользователя(ей) сказали cпасибо:
    Osetin (10.04.2020) tnc (09.04.2020)
  6. #4
    Аватар для tnc
    Пользователь

    Статус
    Оффлайн
    Регистрация
    01.09.2019
    Сообщений
    121
    Репутация:
    26 ±
    спасибо. проверю, как будет время.

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

    Статус
    Оффлайн
    Регистрация
    09.08.2019
    Сообщений
    45
    Репутация:
    9 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Во-первых, искренне не понимаю, откуда вообще взялось название "ulong". Если рассматривать это с позиции разработчика, знакомого как минимум с C/C++, слово "long" подразумевает тип данных большего размера, т.е. не 4 байта (размер ячейки), а 8. Здесь же тип "ulong" ограничен всё теми же 4 байтами и является просто чем-то вроде беззнакового типа данных ("чем-то вроде", потому что в Pawn нет типов данных как таковых - есть теги) и было бы логичнее назвать его "ucell" (т.е. "беззнаковая ячейка"; кстати, именно так этот тип данных и называется в исходниках Pawn). Впрочем, это так, небольшая придирка, на работе инклуда это не сказывается =)
    Да и вообще, это ничто на фоне других популярных инклудов/плагинов - взять, к примеру, небезызвестные плагины с нелепыми хайповыми названиями, начинающимися на "Pawn.*", как будто они являются частью проекта Pawn (т.е. наравне с компилятором, интерпретатором и стандартными библиотеками; не говоря уже о том, что это тянет на недобросовестное использование торговой марки "Pawn").

    Во-вторых,

    если передаваемый в функцию массив используется только для чтения, его следует помечать как "const" (т.е. в данном случае - "const str[]").

    В-третьих,

    https://pro-pawn.ru/showthread.php?1...ng-210-%28-%29

    В-четвёртых, зачем нужен параметр "off", если функцию можно использовать так:

    ?

    В-пятых, не используется параметр "size" (ты это имел в виду под "unsafe-функция"?), но он и не нужен - строка всё равно заканчивается нуль-символом, на котором выполнение цикла while прервётся, так что ситуация с OOB исключена. По этой же причине и у стандартной функции strval() нет параметра "size".

    В-шестых, параметр "ispacked" тоже не особо нужен, упакованность строки можно проверить и внутри самой функции.

    И, наконец, в-седьмых, с помощью оператора __emit вычитание кода символа "0" можно записать так:
    1. add.c (-'0')

    , т.е. без загрузки значения в ALT, благодаря чему не нужно лишний раз сохранять другое значение из PRI в стек.

    В итоге у меня получилась такая функция:
    1. stock ulong:ulong_strval(const str[])
    2. {
    3. new const bool:packed = (str[0] & ~0xFF != 0);
    4. new ulong:result = ulong:0;
    5. new pos = 0;
    6. new c;
    7. while ('0' <= (c = (packed ? str{pos} : str[pos])) <= '9') {
    8. __emit load.s.pri result;
    9. __emit const.alt 10;
    10. __emit umul;
    11. __emit move.alt;
    12. __emit load.s.pri c;
    13. __emit add.c (-'0');
    14. __emit add;
    15. __emit stor.s.pri result;
    16. pos++;
    17. }
    18. return result;
    19. }



    А что ты ожидал? =)
    Подсветка работает на простой замене текста, ибо полноценный анализ синтаксиса => неоправданная нагрузка на сервер (либо на клиент, если делать клиент-сайдом на js).
    "давно я не писал на pawn, попробую написать." =) я знал, что ты это исправишь, спасибо.

 

 

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

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

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

Ваши права

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