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

Реклама


**Как получить V.I.P** (Перейти)
Чтобы заказать рекламу на Pro-Pawn.Ru, обращайтесь в Skype.
Баннерная реклама 200руб/мес, Текстовая 100руб/мес.
Показано с 1 по 9 из 9
  1. #1
    Аватар для Daniel_Cortez
    new fuck_logic[0] = EOS;

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    1,662
    Репутация:
    2145 ±

    GetPlayerSubnet - узнать подсеть игрока

    Описание:
    Возвращает подсеть игрока. Задумана, как дополнение к стандартной функции GetPlayerIp.

    Параметры и возвращаемое значение:
    Те же самые, что и в GetPlayerIp.

    Плюсы реализации:
    1. Производительность. Отсутствуют лишние потери времени из-за вызова нативных функций.
    2. Реализация функции не зависит от sscanf2. Если вы не используете этот плагин, вам не придётся устанавливать его из-за одной-единственной функции.

    Код:
    PHP код:
    stock GetPlayerSubnet(playeridbuffer[], size=sizeof(buffer))
    {
    // by Daniel_Cortez \\ pro-pawn.ru
        
    GetPlayerIp(playeridbuffersize);
        for(new 
    i=0,dots=0; ; ++i)
            switch(
    buffer[i])
            {
                case 
    '\0':
                    break;
                case 
    '.':
                    if(++
    dots == 2)
                    {
                        
    buffer[i] = '\0';
                        break;
                    }
            }

    Примечания:
    Некоторые могут усмотреть в реализации слишком сложный код.
    Да, всю задачу можно решить буквально в пару строк, используя функции sscanf и format.
    Однако такая функция вряд ли оправдывала бы себя в плане производительности.
    На самом деле считывание двух чисел из строки и их преобразование обратно в строковый формат совершенно ни к чему, когда можно просто найти 2-й символ "." во входной строке и поставить на его место нуль-символ, тем самым "отрезав" всё, что находится после 2-го числа. Просто и эффективно.

    Пример использования:
    PHP код:
    new ip[16], subnet[8];
    GetPlayerIp(playeridipsizeof(ip));
    GetPlayerSubnet(playeridsubnetsizeof(subnet));
    new 
    string[40];
    format(stringsizeof(string), "Ваш IP: %s, подсеть: %s"ipsubnet);
    SendClientMessage(playerid, -1string); 
    Автор: Daniel_Cortez

    Специально для Pro-Pawn.ru
    Копирование данной статьи на других ресурсах без разрешения автора запрещено.
    Индивидуально в PM и Skype по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
    SA-MP 0.4 is a lie

  2. 4 пользователя(ей) сказали cпасибо:
    Edwin (29.02.2016)franked (17.02.2016)gangzone.ini (18.04.2015)untonyst (17.04.2015)
  3. #2
    Аватар для Nazarik
    Пользователь

    Статус
    Оффлайн
    Регистрация
    11.09.2013
    Адрес
    Ukraine | Lvov
    Сообщений
    21
    Репутация:
    11 ±
    Я бы предложил вот такой вариант реализации:

    PHP код:
    stock GetPlayerSubnet(playeridbuffer[], size sizeof buffer// by Nazarik
    {
        if(
    size 8) return ;
        
        
    GetPlayerIp(playeridbuffersize);
        
        new 
    posdots;
        while((
    pos strfind(buffer"."truepos 1)) != -1)
        {
            if(++
    dots == 2)
            {
                
    buffer[pos] = 0;
                break;
            }
        }

    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Производительность. Отсутствуют лишние потери времени из-за вызова нативных функций.
    Именно в данном случае сложно согласится.
    Чисто теоретически тот вариант который предложил я, должен быть более производительным. Хотя могу быть неправ.

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    1,662
    Репутация:
    2145 ±
    Цитата Сообщение от Nazarik Посмотреть сообщение
    Я бы предложил вот такой вариант реализации:
    Цитата Сообщение от Nazarik Посмотреть сообщение
    PHP код:
    if(size 8) return ; 
    GetPlayerIp возвращает IP-адрес даже в том случае, когда размер буфера меньше 16 ячеек.
    Поэтому логично будет оставить ту же логику и в GetPlayerSubnet.


    Цитата Сообщение от Nazarik Посмотреть сообщение
    Именно в данном случае сложно согласится.
    Хотите сказать, что нативные функции выполняются быстрее, чем аналогичный код на Pawn?


    Цитата Сообщение от Nazarik Посмотреть сообщение
    Чисто теоретически тот вариант который предложил я, должен быть более производительным. Хотя могу быть неправ.
    Зачем гадать, когда можно просто взять и проверить?
    Проведём замер на примере функции tolower - пожалуй, самый простой пример замены нативки на Pawn-функцию.

     Кодъ
    PHP код:
    #include <a_samp>

    #define PROFILE_ITERS_MAJOR 1000000
    #define PROFILE_ITERS_MINOR 100

    stock tolower2(ch)
        return (
    'a' <= ch <= 'z') ? (ch-('a'-'A')) : ch;

    main()
    {
        new 
    tx;
        new 
    t0 0t1 0;
        print(
    "\nProfiling, please wait...");
        for(new 
    i=0,j!= PROFILE_ITERS_MAJOR; ++i)
        {
            
    GetTickCount();
            for(
    j=0!= PROFILE_ITERS_MINOR; ++j)
                
    tolower('x');
            
    t0 += GetTickCount()-t;
            
    GetTickCount();
            for(
    j=0!= PROFILE_ITERS_MINOR; ++j)
                
    tolower2('x');
            
    t1 += GetTickCount()-t;
        }
        
    #pragma unused x
        
    printf("tolower (native):\t%d"t0);
        
    printf("tolower (Pawn):\t\t%d"t1);



    Для тех, кому лень запускать тесты, выложу свои результаты:
    Код HTML:
    tolower (native):       17284
    tolower (Pawn):         11864
    + результаты того же теста при запуске с плагином JIT:
    Код HTML:
    tolower (native):       12946
    tolower (Pawn):         1090
    Как видно из результатов, реализация на чистом Pawn обгоняет нативную реализацию от 1.5 до 10+ раз.

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

  5. #4
    Аватар для gangzone.ini
    Модератор

    Статус
    Оффлайн
    Регистрация
    15.06.2014
    Сообщений
    650
    Репутация:
    105 ±
    Круто!
    Модератор с 19.03.2015

  6. #5
    Аватар для Иван Бубнов
    Пользователь

    Статус
    Оффлайн
    Регистрация
    22.12.2015
    Сообщений
    162
    Репутация:
    8 ±
    Daniel_Cortez, был бы очень рад если релизните аналогичную функцию - GetIpSubnet(ip[], buffer[], size = sizeof buffer), надеюсь, что я буду не единственным довольным

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

    Статус
    Оффлайн
    Регистрация
    08.12.2015
    Адрес
    San Fierro
    Сообщений
    204
    Репутация:
    38 ±
    PHP код:
    stock GetIpSubnet(buffer[], size=sizeof(buffer))
    {
    // by Daniel_Cortez, modified by TheMallard \\ pro-pawn.ru
        
    for(new i=0,dots=0; ; ++i)
            switch(
    buffer[i])
            {
                case 
    '\0':
                    break;
                case 
    '.':
                    if(++
    dots == 2)
                    {
                        
    buffer[i] = '\0';
                        break;
                    }
            }


  8. #7
    Аватар для Иван Бубнов
    Пользователь

    Статус
    Оффлайн
    Регистрация
    22.12.2015
    Сообщений
    162
    Репутация:
    8 ±
    Цитата Сообщение от TheMallard Посмотреть сообщение
    PHP код:
    stock GetIpSubnet(buffer[], size=sizeof(buffer))
    {
    // by Daniel_Cortez, modified by TheMallard \\ pro-pawn.ru
        
    for(new i=0,dots=0; ; ++i)
            switch(
    buffer[i])
            {
                case 
    '\0':
                    break;
                case 
    '.':
                    if(++
    dots == 2)
                    {
                        
    buffer[i] = '\0';
                        break;
                    }
            }

    Благодарен) Делал проверку подсети для системы PIN-кода (циферблат) как на адвансе :)

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

    Цитата Сообщение от TheMallard Посмотреть сообщение
    PHP код:
    stock GetIpSubnet(buffer[], size=sizeof(buffer))
    {
    // by Daniel_Cortez, modified by TheMallard \\ pro-pawn.ru
        
    for(new i=0,dots=0; ; ++i)
            switch(
    buffer[i])
            {
                case 
    '\0':
                    break;
                case 
    '.':
                    if(++
    dots == 2)
                    {
                        
    buffer[i] = '\0';
                        break;
                    }
            }

    Не работает

  9. #8
    Аватар для Londlem
    Модератор

    Статус
    Оффлайн
    Регистрация
    19.10.2013
    Сообщений
    1,360
    Репутация:
    767 ±
    Цитата Сообщение от TheMallard Посмотреть сообщение
    PHP код:
    stock GetIpSubnet(buffer[], size=sizeof(buffer))
    {
    // by Daniel_Cortez, modified by TheMallard \\ pro-pawn.ru
        
    for(new i=0,dots=0; ; ++i)
            switch(
    buffer[i])
            {
                case 
    '\0':
                    break;
                case 
    '.':
                    if(++
    dots == 2)
                    {
                        
    buffer[i] = '\0';
                        break;
                    }
            }

    Здесь size вообще не нужен.

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

    Статус
    Оффлайн
    Регистрация
    08.12.2015
    Адрес
    San Fierro
    Сообщений
    204
    Репутация:
    38 ±
    Судя по логике - работать должно.

 

 

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

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

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

Ваши права

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