Просмотр полной версии : [Вопрос] Подключение 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)).
Попробуй скомпилировать в режиме совместимости: 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:
Появилось огромное количество ошибок (в т.ч. и в скачанных инклудах (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. За практическим применением уже скорее всего к самому автору, т.к. очевидно, что писалось под конкретный мод
Меня интересует конкретно строка:
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:
Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot