ALS4 method 7, вот как это называется.
ALS4 method 7, вот как это называется.
Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
Стол заказов:
Мои работы:
Спустя 4 года после предыдущего релиза Pawn (4.0.4733), выпущена новая стабильная версия: 4.0.5588.
Обновлена документация, теперь в ней описаны если не все, то многие новые фичи с момента предыдущего релиза (+ новый стильный шрифт).
Скачать пакет для разработки под Windows можно здесь: http://www.compuphase.com/pawn/pawn.htm#DOWNLOAD_WIN
Проблема с перехватами исправлена, но компилятор всё ещё выдаёт варнинги, если функция не объявлена перед выражением "#if defined <имя функции>".
Решается эта проблема очень просто: нужно всего лишь переместить предварительное объявление (forward) перехваченной функции из самого конца перехвата в начало, чтобы она была объявлена до #if defined.
Например, так будет выглядеть перехват OnGameModeInit:
Кстати говоря, в SA-MP (Pawn 3.2) такой подход тоже работает (более того, он совместим с "традиционным" ALS4, в котором строка с forward ставится в конце перехвата), поэтому есть смысл использовать его и там для обратной совместимости.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
P.S. Кто-нибудь пробовал собрать компилятор под Linux из последних исходников? Как-то это подозрительно, что файл process.h, который обычно присущ только для DOS, Windows и QNX, используется в sc1.c для всех целевых платформ.
Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
Стол заказов:
Мои работы:
Только сейчас заметил, что тот запускаемый файл оканчивается на ".exe". В таком случае это явно баг.
Твой Pull Request примут не скоро (если примут вообще) по очень простой причине: разработчику Pawn наверняка придётся протестировать внесённые тобой изменения на нескольких целевых платформах, на что у него вряд ли есть время - он сам говорил, что у него много работы и почти нет времени на собственные проекты.
ИМХО, по-хорошему следовало бы создать issue и в нём отрепортить проблему (заодно упомянув про битый ярлык на quincy.exe) или сделать отдельный PR с исправлением той проблемы с process.h - не пришлось бы ждать проверки всей кучи изменений, которая всё равно вряд ли будет принята.
Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
Стол заказов:
Мои работы:
Да, действительно, немного поторопился с выводами.
Присмотрелся к твоим изменениям и несколько моментов вызвало вопросы.
Во-первых, сразу бросается в глаза такая попытка приведения типа (правильнее было бы сказать "каламбур типизации", но я не уверен, знает ли кто-нибудь здесь о таком понятии):
Вместо указателя на структуру FILE будет передан указатель на ячейку params[1], которая должна содержать указатель на FILE - в итоге вместо просто указателя получаем... указатель на указатель.Код:return fclose((FILE*)¶ms[1]) == 0;
Возможно, правильнее было бы вот так:
Во-вторых, описанный выше метод приведения типа безопасен только если размеры типов совпадают - например, если размер указателя и ячейки Pawn по 32 бита. Если же собрать Pawn с 64-битным размером ячейки под 32-разрядной платформой, результат конверсии может оказаться неправильным.Код:return fclose(*(FILE*)¶ms[1]) == 0;
Рассмотрим такой пример:
Поскольку размер ячейки 64 бита, то по адресу, где расположен указатель f, будет считано не 32 бита, а 64, т.е. кроме указателя будут считаны ещё и следующие 32 бита и в x будет неправильное значение.PHP код:
FILE *f = fopen(...);
cell x = *(cell *)&f;
Проще скрыть предупреждения компилятора с помощью #pragma GCC diagnostic ignored, как это уже было сделано в последнем коммите перед релизом 5588. Возможно даже, что после того коммита никаких предупреждений с приведением типов уже не будет и часть изменений в PR можно убрать.
И да, раз уж ты взялся за обновление того реквеста, не мог бы внести изменение, которое я описал в комментарии к PR?
Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
Стол заказов:
Мои работы:
VVWVV (30.10.2016)
Сделал.
Daniel_Cortez (30.10.2016)
Ок, ещё один интересный момент:
Такой подход прокатил бы в Pawn, но в C и C++ оператор defined работает только в директивах #if/#elif и только с названиями макросов (если это только не какое-то нестандартное расширение, специфичное для какого-то одного или нескольких компиляторов).PHP код:
#if !defined toupper
#define toupper(c) ( (c)>='A' && (c)<='Z' ? (c) + 'A' - 'a' : (c) )
#endif
Даже если функция toupper была объявлена в одном из заголовочных файлов, выражение "defined toupper" вернёт false и твой макрос в любом случае заменит эту функцию.
Должно быть какое-то решение получше, чем это. ИМХО, даже просто ничего не делать, оставив предупреждение компилятора о необъявленной функции, будет лучше, т.к. функция toupper всё равно есть в стандартной библиотеке (libc.so или как ещё она должна называться).
Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
Стол заказов:
Мои работы:
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)