Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 3 из 4 ПерваяПервая 1 2 3 4 ПоследняяПоследняя
Показано с 21 по 30 из 32
  1. #21
    Аватар для $continue$
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.08.2014
    Адрес
    г. Киров (aka Вятка)
    Сообщений
    1,487
    Репутация:
    276 ±
    Цитата Сообщение от seriu Посмотреть сообщение
    ты юзаешь Алс хуки, зачем столько проблем?
    Просто процитирую сообщения DC:
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Для тех, кто любит стрелять себе в ногу:
      Открыть/закрыть

    3. Как-то давно один "профессионал" спросил меня, мол зачем вся эта чепуха с перехватами, когда всё можно уместить в один #define?
    PHP код:
    stock my_AddStaticVehicle(modelidFloat:spawn_xFloat:spawn_yFloat:spawn_zFloat:anglecolor1color2)
    {
        print(
    'Функция AddStaticVehicle перехвачена');
        return 
    AddStaticVehicle(modelidspawn_xspawn_yspawn_zanglecolor1color2);
    }
    #define AddStaticVehicle my_AddStaticVehicle 
    Так вот, этот метод в корне неправильный.

    Почему? Очень просто, им нельзя сделать больше одного перехвата на одну и ту же функцию.
    Не верите? Тогда попробуйте скомпилировать такой код:
    PHP код:
    // 2-й перехватчик для AddStaticVehicle
    stock my2_AddStaticVehicle(modelidFloat:spawn_xFloat:spawn_yFloat:spawn_zFloat:anglecolor1color2)
    {
        print(
    'Функция AddStaticVehicle перехвачена ещё раз');
        return 
    AddStaticVehicle(modelidspawn_xspawn_yspawn_zanglecolor1color2);
    }
    #define AddStaticVehicle my2_AddStaticVehicle
     
    // 1-й перехватчик для AddStaticVehicle
    // Здесь будет "warning 201: redefinition of constant/macro (symbol "AddStaticVehicle")".
    stock my1_AddStaticVehicle(modelidFloat:spawn_xFloat:spawn_yFloat:spawn_zFloat:anglecolor1color2)
    {
        print(
    'Функция AddStaticVehicle перехвачена');
        return 
    AddStaticVehicle(modelidspawn_xspawn_yspawn_zanglecolor1color2);
    }
    #define AddStaticVehicle my1_AddStaticVehicle 
    Получилось скомпилировать код без варнингов и ошибок? Я предупреждал.

    Такой способ подойдёт только если вы используете его в своём моде и только если вы перехватываете функцию один раз (хоть я этого и не рекомендую).
    Но если вы используете этот ленивый способ в выкладываемых на Pro-Pawn работах (да, я смотрю на вас, авторы уроков и мануалов), даже не надейтесь, что ваша работа будет одобрена.
    Вы явно ошиблись порталом, если думаете, что можно одобрить полурабочий говнокод, который может нарушить совместимость с другими работами.
    Value your freedom or you will lose it, teaches history. "Don't bother us with politics," respond those who don't want to learn. (c) Richard Stallman

  2. Пользователь сказал cпасибо:
    VVWVV (13.01.2016)
  3. #22
    Аватар для seriu
    Пользователь

    Статус
    Оффлайн
    Регистрация
    29.11.2013
    Сообщений
    69
    Репутация:
    6 ±
    Цитата Сообщение от $continue$ Посмотреть сообщение
    Просто процитирую сообщения DC:
    Круто, не знал.
    Но по факту ты видел код с моим #define?
    Цитата Сообщение от seriu Посмотреть сообщение
    PHP код:
    #define Random(%0,%1) random(%1-%0)+%0 
    Почему? Очень просто, им нельзя сделать больше одного перехвата на одну и ту же функцию.
    эм, как бэ я и не перехватываю random.
    я создаю макрос который автоматически выдает при компиляции стандартную функцию.

  4. #23
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Цитата Сообщение от seriu Посмотреть сообщение
    Круто, не знал.
    Но по факту ты видел код с моим #define?

    PHP код:
    #define Random(%0,%1) random(%1-%0)+%0 
    эм, как бэ я и не перехватываю random.
    я создаю макрос который автоматически выдает при компиляции стандартную функцию.
    Не стоит использовать define таким образом. Вот пример кода, где твоё решение выдаст некорректный результат:
    PHP код:
    Random(510) * 3;
    // что будет после работы препроцессора
    random(10 5) + 3
    ещё пример:
    PHP код:
    Random(210);
    // что будет после работы препроцессора
    random(10 2) + 2
    // что равно
    random(3) + 3
    // получаются числа в диапазоне от 3 до 5 включительно, хотя должны быть от 3 до 9 
    Я предпочитаю такую функцию:
    PHP код:
    stock mathrandom(minmax)
    {
        return 
    random(max min 1) + min;

    можно записать в виде макроса так:
    PHP код:
    #define mathrandom(%0,%1) (random((%1) - (%0) + 1) + %0) 
    +1 нужен для того, чтобы в возможный результат включить максимальную границу, ибо для этой функции это поведение более логично.

    Вывод всего этого прост: лучше не используйте макросы, если не до конца понимаете принцип их работы. Разница в скорости минимальна, а от головной боли не избавитесь.
    Последний раз редактировалось ziggi; 13.01.2016 в 19:24.

  5. 2 пользователя(ей) сказали cпасибо:
    $continue$ (13.01.2016) DeimoS (14.01.2016)
  6. #24
    Аватар для seriu
    Пользователь

    Статус
    Оффлайн
    Регистрация
    29.11.2013
    Сообщений
    69
    Репутация:
    6 ±
    Цитата Сообщение от ziggi Посмотреть сообщение
    PHP код:
    Random(210);
    // что будет после работы препроцессора
    random(10 2) + 2
    // что равно
    random(3) + 3
    // получаются числа в диапазоне от 3 до 5 включительно, хотя должны быть от 3 до 9 
    Да ты прав, этого я не предусмотрел.

    PHP код:
    #define Random(%0,%1) random((%1-%0)+%0) 
    это будет даже лучше stock'a.

    Я использую в своем моде, только как min и max плюсов и т.п. я не использую, поэтому даже не думал об этом.

  7. #25
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Цитата Сообщение от seriu Посмотреть сообщение
    Да ты прав, этого я не предусмотрел.

    PHP код:
    #define Random(%0,%1) random((%1-%0)+%0) 
    это будет даже лучше stock'a.

    Я использую в своем моде, только как min и max плюсов и т.п. я не использую, поэтому даже не думал об этом.
    Ты полностью сломал свой макрос, он должен выглядеть так:
    PHP код:
    #define Random(%0,%1) (random((%1)-(%0))+(%0)) 

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

    Статус
    Оффлайн
    Регистрация
    29.11.2013
    Сообщений
    69
    Репутация:
    6 ±
    Цитата Сообщение от ziggi Посмотреть сообщение
    Ты полностью сломал свой макрос, он должен выглядеть так:
    PHP код:
    #define Random(%0,%1) (random((%1)-(%0))+(%0)) 
    Что именно я сломал?
    у меня все ок, мне не понятно о чем ты думал когда имел ввиду "сломал"
    каким образом?
    http://i.imgur.com/1bPQque.png

  9. #27
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Цитата Сообщение от seriu Посмотреть сообщение
    Что именно я сломал?
    у меня все ок, мне не понятно о чем ты думал когда имел ввиду "сломал"
    каким образом?
    http://i.imgur.com/1bPQque.png
    На твоём же скриншоте видна ошибка, в первом тесте получилось 0.

    PHP код:
    Random(5,10
    Результат работы препроцессора:
    PHP код:
    random((10-5)+5)
    // получается
    random(10
    Ещё раз: не используй макросы, если не умеешь, используй функции.

  10. 2 пользователя(ей) сказали cпасибо:
    $continue$ (14.01.2016) seriu (14.01.2016)
  11. #28
    Аватар для Desulaid
    лесоруб продакшен

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    667
    Репутация:
    236 ±
    ziggi, но у тебя тоже нет-нет да и выпадет ноль

    PHP код:
    #define Random(%0,%1) (random((%1)-(%0))+(%0))  

    new j;

    main()
    {
        for(new 
    i100i++)
        {
            
    Random(025);
            if (
    25)
                
    printf("Не оч [%i]"j);
            else if (
    0)
                
    printf("Не оч [%i]"j);
            else if (
    == 0)
                
    printf("Не оч [%i]"j);
        }

    Как на счет

    PHP код:
    #define Random(%0,%1) random((%1 - %0) + %0) + 1 

  12. #29
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Цитата Сообщение от Untonyst Посмотреть сообщение
    ziggi, но у тебя тоже нет-нет да и выпадет ноль

    PHP код:
    #define Random(%0,%1) (random((%1)-(%0))+(%0))  

    new j;

    main()
    {
        for(new 
    i100i++)
        {
            
    Random(025);
            if (
    25)
                
    printf("Не оч [%i]"j);
            else if (
    0)
                
    printf("Не оч [%i]"j);
            else if (
    == 0)
                
    printf("Не оч [%i]"j);
        }

    Как на счет

    PHP код:
    #define Random(%0,%1) random((%1 - %0) + %0) + 1 
    Я что-то не понимаю, или почему при использовании Random(0, 25) не должен выпадать 0?
    Как я писал выше, я предпочитаю функцию, которая включает в рандом обе границы
    PHP код:
    #define mathrandom(%0,%1) (random((%1) - (%0) + 1) + (%0)) 

  13. #30
    Аватар для Desulaid
    лесоруб продакшен

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    667
    Репутация:
    236 ±
    Цитата Сообщение от ziggi Посмотреть сообщение
    Я что-то не понимаю, или почему при использовании Random(0, 25) не должен выпадать 0?
    Как я писал выше, я предпочитаю функцию, которая включает в рандом обе границы
    PHP код:
    #define mathrandom(%0,%1) (random((%1) - (%0) + 1) + (%0)) 
    Ну я просто подумал, что рандом от n1 до n2 не должен включать в себя числа самих границ

 

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

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

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

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

Ваши права

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