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

Реклама



**Как получить V.I.P** (Перейти)
Чтобы заказать рекламу на Pro-Pawn.Ru, обращайтесь в Skype.
Баннерная реклама 100руб/мес, Текстовая 50руб/мес.
Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 14
  1. #1
    Аватар для m1n1vv
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.09.2015
    Сообщений
    243
    Репутация:
    21 ±

    Из двоичной системы счисления в десятичную

    Скрипт переводит числа из двоичной системы счисления в десятичную. Если в переменной sub будет не бинарное число, то скрипт прекратит работу с оповещением об ошибке.
    PHP код:
    CMD:binary(playeridparams[])
    {
        if (
    isnull(params))
            return 
    SendClientMessage(playerid0xAA3333AA, !"[Подсказка]: /b [двоичный код]");

        static const
            
    str[] = "Result: %i";

        new
            
    string[sizeof(str) + 11 2],
            
    result;

        
    Binary(paramsresult);        

        if (!
    result)
            return 
    SendClientMessage(playerid, -1, !"Error");

        
    format(stringsizeof(string), strresult);
        
    SendClientMessage(playerid, -1string);
        
        return 
    1;

    PHP код:
    stock Binary(const sub[], &result)
    {
        new
            
    = -1,
            
    strlen(sub) - 1,
            
    c;
            
        while((
    sub[++i]) != '\0')
        {
            switch (
    c)
            {
                case 
    '0''1':
                {
                    
    result += (== '1') ? (<< i) : (0);
                }
                default:
                {
                    return 
    0;
                }
            }
        }
        
        return 
    result;

    А если нужно сделать просто вычисление, то:
    PHP код:
    main()
    {
        static const
            
    sub[] = "1000101";

        new
            
    result,
            
    error;

        for (new 
    0strlen(sub) - 1<= ni++)
        {
            switch (
    sub[i])
            {
                case 
    '0''1':
                {
                    
    result += (sub[i] == '1') ? (<< i) : (0);
                }
                default:
                {
                    
    error++;
                    break;
                }
            }
        }

        if (!
    error)
        {
            
    printf("\tResult: %i\n"result);
        }
        else
        {
            
    printf("\tError\n");
        }

    P.S. Планирую переделать цикл, где буду использовать только одну переменную, и вывод результата как текст, а не целое число.
    Последний раз редактировалось m1n1vv; 13.11.2016 в 17:21.

  2. #2
    Аватар для Daniel_Cortez
    new fuck_logic[0] = EOS;

    Статус
    Онлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    1,456
    Репутация:
    2018 ±
    Во-первых, в чём смысл команды? Просто вывести игроку, какое число он ввёл?
    Если фишка в самой функции Binary, а не в команде, то и тему следовало создавать в разделе для функций.
    UPD: Сначала по префиксу подумал, что тема находится в разделе "Команды", но только сейчас заметил, что на самом деле она в разделе "Скрипты", с префиксом "[CMD]", а показывается в ней работа функции. Логика, прощай.

    Во-вторых, вы так любите велосипеды? Для считывания двоичного числа из строки давно существует sscanf2.
      Открыть/закрыть
    PHP код:
    CMD:binary(playeridparams[])
    {
        
    extract params -> new bin:x; else // new x; if (sscanf(params, "b", x))
            
    return SendClientMessage(playerid, -1, !"Использование: /binary [число в двоичной системе]");
        static const 
    fmt_str[] = "Вы ввели число %d.";
        new 
    string[sizeof(fmt_str) - 11];
        
    format(stringsizeof(string), fmt_strx);
        return 
    SendClientMessage(playerid, -1string);


    И только не нужно оправдываться, что ваша реализация сделана специально, "чтобы не подключать плагин ради одной задачи".
    На дворе 2016 год и sscanf2 используется почти повсеместно, кроме лишь некоторых "гипотетических" модов, которые не используют команд и не работают со строками.
    Я называю их "гипотетическими" потому, что обычно такие моды либо имеют неудобный пользовательский интерфейс (на одних лишь текстдравах и диалогах далеко не уедешь), либо они недалеки от простого "hello world", либо их создатели - нездоровые люди, одержимые идеей отказа от всех плагинов.
    (Но я всё же надеюсь, что вы просто не знали о спецификаторе "b", ибо то оправдание в случае со sscanf2 выглядело бы очень глупо.)

    В-третьих, вы сами не находите странным, что функция, предназначенная для преобразования из строки в число, показывает игрокам сообщения?
    Реализация алгоритма должна быть изолирована от взаимодействия с пользователем. Как говорится, компот отдельно, мухи отдельно. Очевидно же.
    Индивидуально в PM и Skype по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
    SA-MP 0.4 is a lie

  3. 3 пользователя(ей) сказали cпасибо:
    DeimoS (25.07.2016)Unreal (25.07.2016)ziggi (25.07.2016)
  4. #3
    Аватар для m1n1vv
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.09.2015
    Сообщений
    243
    Репутация:
    21 ±
    1. Если размышлять замкнуто, то да.
    2. Не раз видел, что люди не используют sscanf2. Расизм? Я использовал cmd с sscanf, чтобы просто показать стока. Это можно было расписать и на команду и диалог, но у меня на это времени нет.
    3. Вот это я не понял. Выводит всего 2 сообщения, о конечном результате или ошибке.
    Последний раз редактировалось m1n1vv; 25.07.2016 в 03:36.

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

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    432
    Репутация:
    196 ±
    Цитата Сообщение от m1n1vv Посмотреть сообщение
    3. Вот это я не понял. Выводит всего 2 сообщения, о конечном результате или ошибке.
    Реализация алгоритма должна быть изолирована от взаимодействия с пользователем.
    Алгоритм - функция; Пользователь - вывод сообщений.

    Вы могли сделать так:

    PHP код:
    CMD:b(playeridparams[])
    {
        if (
    isnull(params))
            return 
    SendClientMessage(playerid0xAA3333AA, !"[Подсказка]: /b [двоичный код]");

        new 
    result Binary(params); 
        if (
    result)
        {
             new 
    str[32 /*  магия... */];
             
    format(strsizeof str"%d"result);
             
    SendClientMessage(playerid, -1str);
        }
        else 
    SendClientMessage(playerid, -1, !"Error");

        return 
    1;

    PHP код:
    stock 
        Binary
    (playeridsub[])
    {
        new
            
    result;

        for (new 
    0strlen(sub) - 1<= ni++)
        {
            switch (
    sub[i])
            {
                case 
    '0''1':
                {
                    
    result += (sub[i] == '1') ? (<< i) : (0);
                }
                default:
                {
                    return 
    0;
                }
            }
        }

        return 
    result;

    Последний раз редактировалось VVWVV; 25.07.2016 в 04:25.

  6. Пользователь сказал cпасибо:
    m1n1vv (25.07.2016)
  7. #5
    Аватар для Daniel_Cortez
    new fuck_logic[0] = EOS;

    Статус
    Онлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    1,456
    Репутация:
    2018 ±
    Цитата Сообщение от m1n1vv Посмотреть сообщение
    Если размышлять замкнуто, то да.
    Итак, тема создана в одном разделе, помечена, как будто находится в другом, а говорится в ней о третьем.
    "Размышлять замкнуто"? Ок, если я не увидел в вашей теме некий "скрытый смысл", то, быть может, вы сами введёте в курс дела?


    Цитата Сообщение от m1n1vv Посмотреть сообщение
    Не раз видел, что люди не используют sscanf2. Расизм?
    Забыл ещё упомянуть про RLS (коих будет больше, чем всех остальных перечисленных вместе взятых) и им подобные примеры устаревшего кода. Усугубляет ситуацию ещё и то, что начинающие учатся на таком старомодном коде, а потом сами же усложняют себе жизнь отказом от современных решений, которые и удобнее (как в написании, так и в плане чтения кода), и производительнее прежних. И да, такой отказ можно классифицировать как болезнь: синдром утёнка.
    sscanf2 - это своего рода швейцарский нож, только для скриптинга. Если знать, как им пользоваться, то ему найдётся применение в любом моде (кроме уже упомянутых мной выше хелловорлдов).
    Разумеется, без sscanf2 можно обойтись, но во многих случаях это будет в ущерб читаемости и эффективности работы кода.


    Цитата Сообщение от m1n1vv Посмотреть сообщение
    Вот это я не понял. Выводит всего 2 сообщения, о конечном результате или ошибке.
    Вы там что-то говорили о "замкнутом мышлении"? Ладно, очередной спор всё равно ни к чему не приведёт, поэтому просто попробую помочь.
    Если название функции гласит о том, что функция преобразует строку в число, то она должна выполнять эту и только эту задачу.
    Что, если вам потребуется, чтобы функция не показывала никаких сообщений об ошибке? Будете передавать неправильный ID игрока, чтобы функция SendClientMessage работала вхолостую? Оно и ежу понятно, что это дурной тон.

    Если нужно взаимодействовать с пользователем, это должно быть в коде, вызывающем ту функцию, т.е. в данном случае, за это должен отвечать обработчик команды.
    При ошибке ввода можно сделать так, чтобы функция вернула 0, но этим можно создать неопределённость, поскольку 0 - это правильное число, которое может ввести пользователь. Отрицательные числа тоже правильные: допустим, игрок ввёл число из 32 двоичных разрядов - в этом случае самый старший разряд будет отвечать за знак.
    Логично было бы сделать отдельный аргумент, передаваемый по ссылке, в который функция записывала бы статус успеха.
    PHP код:
    stock BinaryToInt(const str[], &bool:success)
    {
        
    success false;
        new 
    result;
        
    result 0;
        
    // ...
        
    if (...) // Если что-то пошло не так
            
    return 0// В success уже записано false, просто выходим из функции
        // ...
        
    success true;
        return 
    result;

    Использовать эту функцию следует так:
    PHP код:
    new bool:success;
    new 
    BinaryToInt(paramssuccess);
    if (!
    success)
        return 
    SendClientMessage(playerid, -1, ...); 
    Правда, это не очень удобно, ведь нужно временно сохранить получившееся число в переменной, чтобы проверить успех работы функции.
    Лучшим решением будет заставить функцию возвращать статус успеха напрямую, а само число - через один из аргументов.
    PHP код:
    stock bool:BinaryToInt(const str[], &result)
    {
        
    result 0;
        
    // ...
        
    if (...) // Если что-то пошло не так
            
    return false;
        
    // ...
        
    success true;
        return 
    true;

    Использование:
    PHP код:
    new x;
    if (!
    BinaryToInt(paramsx))
        return 
    SendClientMessage(playerid, -1, ...); 
    Намного удобнее. Функция выполняет только строго то, что должна, и нет никаких неопределённостей по поводу правильности ввода.
    Индивидуально в PM и Skype по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
    SA-MP 0.4 is a lie

  8. Пользователь сказал cпасибо:
    m1n1vv (25.07.2016)
  9. #6
    Аватар для BadPawn
    Пользователь

    Статус
    Оффлайн
    Регистрация
    15.01.2016
    Адрес
    Приморье, Спасск-Дальний
    Сообщений
    150
    Репутация:
    7 ±
    что означает символ перед result в шапке функции:

    PHP код:
    stock bool:BinaryToInt(const str[], &result
    PHP код:
    &result 

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    2,931
    Репутация:
    1170 ±
    Цитата Сообщение от BadPawn Посмотреть сообщение
    что означает символ перед result в шапке функции:

    PHP код:
    stock bool:BinaryToInt(const str[], &result
    PHP код:
    &result 
    Вот тут, в самом конце, я давал описание:
    [Урок] Всё о Stock
    Связаться со мной можно в личных сообщениях этой группы

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

    Steve Pavlina

  11. #8
    Аватар для m1n1vv
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.09.2015
    Сообщений
    243
    Репутация:
    21 ±
    PHP код:
    stock bool:BinaryToInt(const str[], &result)
    {
        
    result 0;
        
    // ...
        
    if (...) // Если что-то пошло не так
            
    return false;
        
    // ...
        
    success true;
        return 
    true;

    А откуда тут взялось success?

    PHP код:
    &result 
    Но куда оно вернет?
    Последний раз редактировалось m1n1vv; 25.07.2016 в 13:48.

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    2,931
    Репутация:
    1170 ±
    Цитата Сообщение от m1n1vv Посмотреть сообщение
    PHP код:
    stock bool:BinaryToInt(const str[], &result)
    {
        
    result 0;
        
    // ...
        
    if (...) // Если что-то пошло не так
            
    return false;
        
    // ...
        
    success true;
        return 
    true;

    А откуда тут взялось success?
    Явно обычная опечатка же. Можно было понять


    Цитата Сообщение от m1n1vv Посмотреть сообщение
    PHP код:
    &result 
    Но куда оно вернет?
    В переменную, которую ты укажешь при вызове?
    Связаться со мной можно в личных сообщениях этой группы

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

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    09.09.2015
    Сообщений
    243
    Репутация:
    21 ±
    Daniel_Cortez, давно хотел написать... Не забывай о максимальном количестве цифр в числе. sscanf это не переведет в десятичную систему:
    PHP код:
    1010110111001011010 

 

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

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

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

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

Ваши права

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