Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 3 из 3
  1. #1
    Аватар для h3ckphy
    Пользователь

    Статус
    Оффлайн
    Регистрация
    12.05.2020
    Сообщений
    20
    Репутация:
    1 ±

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

    Смотрите, если ставлю название энума диалогов E_DIALOGS, то в месте, где используются диалоги из этого энума происходят варнинги. Скрины:



    Если убрать из названия энума капслок (написать просто 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"
    Видел в интернете решение, перед переменными из энума ставить пустой тег _:, напр,
    1. ShowPlayerDialog(playerid, _:DIALOG_REGISTER и т.д.)

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

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от h3ckphy Посмотреть сообщение
    Позовите Zeex'a
    А что, кроме него никто не сможет разобраться?


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


    Цитата Сообщение от h3ckphy Посмотреть сообщение
    Если убрать из названия энума капслок (написать просто e_dialogs), то все нормально. В общем потестил, ошибка вылазит, если название начинается с большой буквы. e_DIALOGS проходит, а вот E_dialogs нет. Что за бред?
    Не бред, а задуманное поведение. Теги в Pawn делятся на слабые, названия которых начинаются с маленькой буквы, и сильные, коими являются все остальные (т.е. у последних названия могут начинаться с большой буквы, а также с символов "_" и "@").
    Например, Float - это сильный тег. Если значение с этим тегом попытаться присвоить переменной с другим тегом, компилятор выдаст warning 213 из-за несовпадения тегов:
    1. new Float:f = 1.0;
    2. new x = f; // warning 213: tag mismatch

    А вот стандартный тег bool начинается со маленькой буквы, и поэтому это слабый тег; при несовпадении тегов для него варнинга не будет:
    1. new bool:b = true;
    2. new x = b; // ok
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  3. Пользователь сказал cпасибо:
    h3ckphy (20.05.2020)
  4. #3
    Аватар для h3ckphy
    Пользователь

    Статус
    Оффлайн
    Регистрация
    12.05.2020
    Сообщений
    20
    Репутация:
    1 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    А что, кроме него никто не сможет разобраться?



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



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

    А вот стандартный тег bool начинается со маленькой буквы, и поэтому это слабый тег; при несовпадении тегов для него варнинга не будет:
    1. new bool:b = true;
    2. new x = b; // ok
    Наконец-то нашелся батя, который разложил все по полочкам. Спасибо!

 

 

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

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

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

Ваши права

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