PDA

Просмотр полной версии : [Вопрос] Подключение y_hook



PawnoNoob
29.05.2017, 17:38
Всем привет. Сегодня утром я столкнулся с небольшой проблемой, которая очень-очень мешает мне компилировать мод.
Ещё вчера я редактировал свой код и всё нормально компилировалось, но сегодня компилятор начало крашить. Я вспомнил, что мне советовали скачать компилятор от Zeex (до этого был стандартный, без фиксов), что я и сделал.

При компиляции моего мода я обнаружил ошибку в инклуде y_hooks.inc, которая гласит:

C:\mode\pawno\include\YSI\y_hooks.inc(64) : fatal error 111: user error: Did you do <YSI/y_hooks> instead of the required <YSI\y_hooks>?
Открыв сам инклуд я понял, что ошибка возникает из-за того, что он не подключен:

#if !defined _inc_y_hooks
#error Did you do <YSI/y_hooks> instead of the required <YSI\y_hooks>?
#endif
#undef _inc_y_hooks
Но почему? Ещё вчера всё работало нормально, без всяких ошибок, крашей и тому подобных вещей. Пробовал поменять #include <YSI\y_hooks> на #include <YSI/y_hooks> и наоборот - эффекта никакого.

Хочу подметить, что каждую определённую функцию я подключаю через отдельный инклуд (например, система регистрации и система администрации находятся в разных инклудах (формат .inc, не .pwn)).

ziggi
29.05.2017, 18:56
Попробуй скомпилировать в режиме совместимости: https://github.com/Zeex/pawn/wiki/Compatibility-mode

PawnoNoob
29.05.2017, 19:01
Попробуй скомпилировать в режиме совместимости: https://github.com/Zeex/pawn/wiki/Compatibility-mode

Появилось огромное количество ошибок (в т.ч. и в скачанных инклудах (sscanf, crp и т.д.)). Это, получается, не доставлена скобка? :sad:

ziggi
29.05.2017, 19:22
Появилось огромное количество ошибок (в т.ч. и в скачанных инклудах (sscanf, crp и т.д.)). Это, получается, не доставлена скобка? :sad:

Скорее всего.

PawnoNoob
29.05.2017, 19:43
Скорее всего.

Конкретно попал. А как можно быстро найти эту пропавшую (или лишнюю) скобку?

PawnoNoob
29.05.2017, 23:16
Всё-таки я немного затупил, когда поставил пробел в макросе. Вот сам макрос:

#define function%0(%1) forward %0(%1); public %0(%1)
Но я, думая, что так будет "красивее", сделал вот так:

#define function %0(%1) forward %0(%1); public %0(%1)
Из-за этого и попал в такую вот глупую ситуацию.
Скажите, пожалуйста, почему в макросе нельзя использовать пробел (ну, как у меня показано, например).

И ещё один вопрос, чтобы не создавать ещё одну тему: как лучше подключать другие функции? Подробнее, чтобы не запутать Вас: я подключаю разные функции (система авторизации, регистрации и так далее) из разных файлов, находящихся в отдельной папке, чтобы не запутаться при поиске недоработки или же ошибки. В каком формате это лучше делать? .pwn или .inc?

Ну и последний вопрос, который меня интересует, связан с чем-то неизвестным мне (не знаю названия). В одной из тем ZiGGi отправил мне код, цитирую:


stock SSkin(playerid, bool:isnext, gend, nat, age)
{
new idx = GetPVarInt(playerid, "SkinArrayIndex");

idx += isnext ? 1 : -1;

if (idx >= MAX_SKINS_COUNT) {
idx = 0;
} else if (idx < 0) {
idx = MAX_SKINS_COUNT - 1;
}

for (new i = 0; i < sizeof(skins); i++)
{
if (reg_gend{i} == gend && reg_nat{i} == nat && (age >= reg_minage{i} && age <= reg_maxage{i}))
{
format(s_string, sizeof(s_string), "%i", idx);
SendClientMessage(playerid, -1, s_string);

SetPlayerSkin(playerid, skins[i][idx]);
SetPVarInt(playerid, "SkinArrayIndex", idx);
break;
}
}

return 1;
}

Стартовый скин только задай сам.
Или вызывай SSkin так:

SetPVarInt(playerid, "SkinArrayIndex", -1);
SSkin(playerid, true, gend, nat, age);

Меня интересует конкретно строка:

idx += isnext ? 1 : -1;
Где можно найти информацию о данной "системе" (не знаю, как правильно назвать) и её применение?

Daniel_Cortez
29.05.2017, 23:45
Скажите, пожалуйста, почему в макросе нельзя использовать пробел (ну, как у меня показано, например).
Потому что шаблоном подстановки в макросе считается всё, что идёт до первого пробела.



И ещё один вопрос, чтобы не создавать ещё одну тему: как лучше подключать другие функции? Подробнее, чтобы не запутать Вас: я подключаю разные функции (система авторизации, регистрации и так далее) из разных файлов, находящихся в отдельной папке, чтобы не запутаться при поиске недоработки или же ошибки. В каком формате это лучше делать? .pwn или .inc?
Делайте, как вам удобно. Распространённой практикой считается выносить код из основного файла скрипта (*.pwn) в файлы *.inc, но компилятору всё равно, какое расширение вы дадите файлу.

Nexius_Tailer
29.05.2017, 23:55
Скажите, пожалуйста, почему в макросе нельзя использовать пробел (ну, как у меня показано, например).
Потому что всё, что идёт после пробела является кодом, на который компилятор будет заменять код, который до первого пробела. Это в принципе логично и на самом деле вот в этом варианте:

#define function%0(%1) forward %0(%1); public %0(%1)
Ты по прежнему можешь объявлять паблики, написав их название через пробел после "function", просто в макросе это выглядит так


В каком формате это лучше делать? .pwn или .inc?
Не имеет значения


Меня интересует конкретно строка:

idx += isnext ? 1 : -1;
Где можно найти информацию о данной "системе" (не знаю, как правильно назвать) и её применение?
Странная реализация. Для наглядности условие можно было обрамить в скобки и сделать конкретную проверку. Скорее всего проверяется isnext на нуль: если не равен нулю, то прибавляем к idx 1, а если равен, то -1, т.е. отнимаем 1. За практическим применением уже скорее всего к самому автору, т.к. очевидно, что писалось под конкретный мод

ziggi
30.05.2017, 07:20
Меня интересует конкретно строка:

idx += isnext ? 1 : -1;
Где можно найти информацию о данной "системе" (не знаю, как правильно назвать) и её применение?

Просто более короткая запись этого:


if (isnext) {
idx++;
} else {
idx--;
}

Это называется "тернарный оператор (https://ru.wikipedia.org/wiki/%D0%A2%D0%B5%D1%80%D0%BD%D0%B0%D1%80%D0%BD%D0%B0%D1%8F_%D1%83%D1%81%D0%BB%D0%BE%D0%B2%D0%BD%D0%B0%D1%8F_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F)".

PawnoNoob
30.05.2017, 16:48
Спасибо всем за помощь.:blush2: