PDA

Просмотр полной версии : [Вопрос] Очень странная проблема. (Баг компилятора? Позовите Zeex'a) warning 213 tag mismatch



h3ckphy
19.05.2020, 20:43
Смотрите, если ставлю название энума диалогов E_DIALOGS, то в месте, где используются диалоги из этого энума происходят варнинги. Скрины:
https://i.ibb.co/1rwMBqH/1.png
https://i.ibb.co/8DzSHRV/2.png

Если убрать из названия энума капслок (написать просто e_dialogs), то все нормально. В общем потестил, ошибка вылазит, если название начинается с большой буквы. e_DIALOGS проходит, а вот E_dialogs нет. Что за бред?
Еще, если закомменитировать строки, где варнинги происходят (ShowPlayerDialog), то варнинги пропадают (даже если название остается E_DIALOGS). Т.е. варнинги происходят, когда я использую элементы энума, например, DIALOG_REGISTER в ShowPlayerDialog.
Протестировал это все в new.pwn и варнинги все равно появляются.

Была мысль, вдруг в каком-то инклуде самповском уже есть энум E_DIALOGS, но почему тогда варнинги срабатывают и на другие названия, которые начинаются с большой буквы?

Поставил последний компилятор от Zeex'a. Ошибка та же, но уже более содержательная:
C:\Users\blablabla : warning 213: tag mismatch: expected tag none ("_"), but found "E_DIALOGS"
Видел в интернете решение, перед переменными из энума ставить пустой тег _:, напр,

ShowPlayerDialog(playerid, _:DIALOG_REGISTER и т.д.)

И это работает.. Но все-таки интересно, в чем тут дело

Daniel_Cortez
20.05.2020, 19:07
Позовите Zeex'a
А что, кроме него никто не сможет разобраться?



Смотрите, если ставлю название энума диалогов E_DIALOGS, то в месте, где используются диалоги из этого энума происходят варнинги. Скрины:
https://i.ibb.co/1rwMBqH/1.png
Ну да, если указать название в enum, то это название станет ещё и тегом для всех элементов enum. Так работают перечисления.



Если убрать из названия энума капслок (написать просто e_dialogs), то все нормально. В общем потестил, ошибка вылазит, если название начинается с большой буквы. e_DIALOGS проходит, а вот E_dialogs нет. Что за бред?
Не бред, а задуманное поведение. Теги в Pawn делятся на слабые, названия которых начинаются с маленькой буквы, и сильные, коими являются все остальные (т.е. у последних названия могут начинаться с большой буквы, а также с символов "_" и "@").
Например, Float - это сильный тег. Если значение с этим тегом попытаться присвоить переменной с другим тегом, компилятор выдаст warning 213 из-за несовпадения тегов:

new Float:f = 1.0;
new x = f; // warning 213: tag mismatch

А вот стандартный тег bool начинается со маленькой буквы, и поэтому это слабый тег; при несовпадении тегов для него варнинга не будет:

new bool:b = true;
new x = b; // ok

h3ckphy
20.05.2020, 19:38
А что, кроме него никто не сможет разобраться?



Ну да, если указать название в enum, то это название станет ещё и тегом для всех элементов enum. Так работают перечисления.



Не бред, а задуманное поведение. Теги в Pawn делятся на слабые, названия которых начинаются с маленькой буквы, и сильные, коими являются все остальные (т.е. у последних названия могут начинаться с большой буквы, а также с символов "_" и "@").
Например, Float - это сильный тег. Если значение с этим тегом попытаться присвоить переменной с другим тегом, компилятор выдаст warning 213 из-за несовпадения тегов:

new Float:f = 1.0;
new x = f; // warning 213: tag mismatch

А вот стандартный тег bool начинается со маленькой буквы, и поэтому это слабый тег; при несовпадении тегов для него варнинга не будет:

new bool:b = true;
new x = b; // ok

Наконец-то нашелся батя, который разложил все по полочкам. Спасибо!:thank_you: