Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 2 из 3 ПерваяПервая 1 2 3 ПоследняяПоследняя
Показано с 11 по 20 из 23
  1. #11
    Аватар для TheMallard
    Пользователь

    Статус
    Оффлайн
    Регистрация
    08.12.2015
    Адрес
    San Fierro
    Сообщений
    217
    Репутация:
    39 ±
    ALS4 method 7, вот как это называется.

  2. #12
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от TheMallard Посмотреть сообщение
    ALS4 method 7, вот как это называется.
    "method 7" указано в скобках, поскольку ещё 3-x методов перехвата не было в ALS (оказались неприемлемыми по тем или иным критериям). Среди ALS же это 4-й способ, отсюда и название ALS4.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  3. #13
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Спустя 4 года после предыдущего релиза Pawn (4.0.4733), выпущена новая стабильная версия: 4.0.5588.
    Обновлена документация, теперь в ней описаны если не все, то многие новые фичи с момента предыдущего релиза (+ новый стильный шрифт).
    Скачать пакет для разработки под Windows можно здесь: http://www.compuphase.com/pawn/pawn.htm#DOWNLOAD_WIN

    Проблема с перехватами исправлена, но компилятор всё ещё выдаёт варнинги, если функция не объявлена перед выражением "#if defined <имя функции>".
    Решается эта проблема очень просто: нужно всего лишь переместить предварительное объявление (forward) перехваченной функции из самого конца перехвата в начало, чтобы она была объявлена до #if defined.
    Например, так будет выглядеть перехват OnGameModeInit:
    PHP код:
    forward my_library__OnGameModeInit(); // Теперь строка с forward должна быть здесь.
    public OnGameModeInit()
    {
        
    /* Ваши действия. */ print("OnGameModeInit() hook");
    #if defined my_library__OnGameModeInit
        
    my_library__OnGameModeInit();
    #endif
        
    return 1;
    }
    #if defined _ALS_OnGameModeInit
        #undef OnGameModeInit
    #else
        #define _ALS_OnGameModeInit
    #endif
    #define OnGameModeInit my_library__OnGameModeInit 
    Кстати говоря, в SA-MP (Pawn 3.2) такой подход тоже работает (более того, он совместим с "традиционным" ALS4, в котором строка с forward ставится в конце перехвата), поэтому есть смысл использовать его и там для обратной совместимости.


    P.S. Кто-нибудь пробовал собрать компилятор под Linux из последних исходников? Как-то это подозрительно, что файл process.h, который обычно присущ только для DOS, Windows и QNX, используется в sc1.c для всех целевых платформ.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

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

    Статус
    Оффлайн
    Регистрация
    07.06.2016
    Адрес
    Minsk, Belarus
    Сообщений
    78
    Репутация:
    15 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Спустя 4 года после предыдущего релиза Pawn (4.0.4733), выпущена новая стабильная версия: 4.0.5588.
    Обновлена документация, теперь в ней описаны если не все, то многие новые фичи с момента предыдущего релиза (+ новый стильный шрифт).
    Скачать пакет для разработки под Windows можно здесь: http://www.compuphase.com/pawn/pawn.htm#DOWNLOAD_WIN

    Проблема с перехватами исправлена, но компилятор всё ещё выдаёт варнинги, если функция не объявлена перед выражением "#if defined <имя функции>".
    Решается эта проблема очень просто: нужно всего лишь переместить предварительное объявление (forward) перехваченной функции из самого конца перехвата в начало, чтобы она была объявлена до #if defined.
    Например, так будет выглядеть перехват OnGameModeInit:
    PHP код:
    forward my_library__OnGameModeInit(); // Теперь строка с forward должна быть здесь.
    public OnGameModeInit()
    {
        
    /* Ваши действия. */ print("OnGameModeInit() hook");
    #if defined my_library__OnGameModeInit
        
    my_library__OnGameModeInit();
    #endif
        
    return 1;
    }
    #if defined _ALS_OnGameModeInit
        #undef OnGameModeInit
    #else
        #define _ALS_OnGameModeInit
    #endif
    #define OnGameModeInit my_library__OnGameModeInit 
    Кстати говоря, такой подход работает и в SA-MP (Pawn 3.2), поэтому есть смысл использовать его и там для обратной совместимости.


    P.S. Кто-нибудь пробовал собрать компилятор под Linux из последних исходников? Как-то это подозрительно, что файл process.h, который обычно присущ только для DOS, Windows и QNX, используется в sc1.c для всех целевых платформ.
    При установке полного пакета инструментов для Windows, в пуске создается ярлык "Pawn IDE (Quincy)" ссылающийся на "quincy.exe", хотя он должен называться "wxQuincy.exe". Не удивлюсь, если разработчики что-то напутали и с другими платформами.

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

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    P.S. Кто-нибудь пробовал собрать компилятор под Linux из последних исходников? Как-то это подозрительно, что файл process.h, который обычно присущ только для DOS, Windows и QNX, используется в sc1.c для всех целевых платформ.
    Не работает, тем более там запускается некий *stategraph.exe. Свой Pull Request я обновил, но что-то сомневаюсь, что его когда-либо сольют с основной ветвью.

  6. #16
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от ziggi Посмотреть сообщение
    Не работает, тем более там запускается некий *stategraph.exe. Свой Pull Request я обновил, но что-то сомневаюсь, что его когда-либо сольют с основной ветвью.
    Только сейчас заметил, что тот запускаемый файл оканчивается на ".exe". В таком случае это явно баг.
    Твой Pull Request примут не скоро (если примут вообще) по очень простой причине: разработчику Pawn наверняка придётся протестировать внесённые тобой изменения на нескольких целевых платформах, на что у него вряд ли есть время - он сам говорил, что у него много работы и почти нет времени на собственные проекты.

    ИМХО, по-хорошему следовало бы создать issue и в нём отрепортить проблему (заодно упомянув про битый ярлык на quincy.exe) или сделать отдельный PR с исправлением той проблемы с process.h - не пришлось бы ждать проверки всей кучи изменений, которая всё равно вряд ли будет принята.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  7. 2 пользователя(ей) сказали cпасибо:
    Redsan (29.10.2016) VVWVV (29.10.2016)
  8. #17
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Только сейчас заметил, что тот запускаемый файл оканчивается на ".exe". В таком случае это явно баг.
    Твой Pull Request примут не скоро (если примут вообще) по очень простой причине: разработчику Pawn наверняка придётся протестировать внесённые тобой изменения на нескольких целевых платформах, на что у него вряд ли есть время - он сам говорил, что у него много работы и почти нет времени на собственные проекты.

    ИМХО, по-хорошему следовало бы создать issue и в нём отрепортить проблему (заодно упомянув про битый ярлык на quincy.exe) или сделать отдельный PR с исправлением той проблемы с process.h - не пришлось бы ждать проверки всей кучи изменений, которая всё равно вряд ли будет принята.
    Он половину проблем исправил, теперь PR довольно мал: 4 изменённых файла, ~30 изменённых строк.

  9. #18
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от ziggi Посмотреть сообщение
    Он половину проблем исправил, теперь PR довольно мал: 4 изменённых файла, ~30 изменённых строк.
    Да, действительно, немного поторопился с выводами.

    Присмотрелся к твоим изменениям и несколько моментов вызвало вопросы.
    Во-первых, сразу бросается в глаза такая попытка приведения типа (правильнее было бы сказать "каламбур типизации", но я не уверен, знает ли кто-нибудь здесь о таком понятии):
    Код:
    return fclose((FILE*)&params[1]) == 0;
    Вместо указателя на структуру FILE будет передан указатель на ячейку params[1], которая должна содержать указатель на FILE - в итоге вместо просто указателя получаем... указатель на указатель.
    Возможно, правильнее было бы вот так:
    Код:
    return fclose(*(FILE*)&params[1]) == 0;
    Во-вторых, описанный выше метод приведения типа безопасен только если размеры типов совпадают - например, если размер указателя и ячейки Pawn по 32 бита. Если же собрать Pawn с 64-битным размером ячейки под 32-разрядной платформой, результат конверсии может оказаться неправильным.
    Рассмотрим такой пример:
    PHP код:
    FILE *fopen(...);
    cell x = *(cell *)&f
    Поскольку размер ячейки 64 бита, то по адресу, где расположен указатель f, будет считано не 32 бита, а 64, т.е. кроме указателя будут считаны ещё и следующие 32 бита и в x будет неправильное значение.
    Проще скрыть предупреждения компилятора с помощью #pragma GCC diagnostic ignored, как это уже было сделано в последнем коммите перед релизом 5588. Возможно даже, что после того коммита никаких предупреждений с приведением типов уже не будет и часть изменений в PR можно убрать.

    И да, раз уж ты взялся за обновление того реквеста, не мог бы внести изменение, которое я описал в комментарии к PR?
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  10. Пользователь сказал cпасибо:
    VVWVV (30.10.2016)
  11. #19
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Сделал.

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Ок, ещё один интересный момент:
    PHP код:
    #if !defined toupper
      #define toupper(c)     ( (c)>='A' && (c)<='Z' ? (c) + 'A' - 'a' : (c) )
    #endif 
    Такой подход прокатил бы в Pawn, но в C и C++ оператор defined работает только в директивах #if/#elif и только с названиями макросов (если это только не какое-то нестандартное расширение, специфичное для какого-то одного или нескольких компиляторов).
    Даже если функция toupper была объявлена в одном из заголовочных файлов, выражение "defined toupper" вернёт false и твой макрос в любом случае заменит эту функцию.
    Должно быть какое-то решение получше, чем это. ИМХО, даже просто ничего не делать, оставив предупреждение компилятора о необъявленной функции, будет лучше, т.к. функция toupper всё равно есть в стандартной библиотеке (libc.so или как ещё она должна называться).
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

 

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

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

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

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

Ваши права

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