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

    Статус
    Оффлайн
    Регистрация
    05.11.2017
    Сообщений
    136
    Репутация:
    10 ±

    const-корректность

    Всем привет. Подскажите пожалуйста, тот факт, что константную строку нельзя передать в качестве аргумента ShowPlayerDialog, - это баг компилятора или это некая особенность? К слову, проверял и в NotePad++, и в Visual Studio Code:

    1. new const gText[] = "какая-то строка";
    2. ShowPlayerDialog(playerid, 0, DIALOG_STYLE_MSGBOX, "Название", "Текст", "Кнопка1", gText);
    3.  
    4.  
    5. // error 035: argument type mismatch (argument 7)
    6.  
    7.  
    8. new const gText[] = "какая-то строка";
    9. ShowPlayerDialog(playerid, 0, DIALOG_STYLE_MSGBOX, "Название", "Текст", gText, "Кнопка2");
    10.  
    11.  
    12. // error 035: argument type mismatch (argument 6)
    13.  
    14.  
    15. new const gText[] = "какая-то строка";
    16. ShowPlayerDialog(playerid, 0, DIALOG_STYLE_MSGBOX, "Название", gText, "Кнопка1", "Кнопка2");
    17.  
    18.  
    19. // error 035: argument type mismatch (argument 5)
    20.  
    21.  
    22. new const gText[] = "какая-то строка";
    23. ShowPlayerDialog(playerid, 0, DIALOG_STYLE_MSGBOX, gText, "Текст", "Кнопка1", "Кнопка2");
    24.  
    25.  
    26. // error 035: argument type mismatch (argument 4)


    Аналогичная ситуация со static const. А если использовать просто new или просто static - все хорошо.

    (я на этом пытаюсь выиграть в памяти, поскольку у меня порядка 30 диалогов с одинаковыми названиями и кнопками)

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Одно из многих проявлений того, что в SA-MP Team попросту не знают Pawn и в инклудах делают всё на тяп-ляп. И это самое "тяп-ляп" остаётся и по сей день, спустя 10 лет, ибо они, как правило, не заинтересованы в исправлении багов - если только эти баги не вызывают падение сервера или иным образом мешают получать прибыль с Hosted'а.

    Как бы то ни было, суть бага в том, что заголовок функции записан неправильно: массивы в аргументах указаны без атрибута const
    1. native ShowPlayerDialog(playerid, dialogid, style, caption[], info[], button1[], button2[]);

    в то время как правильно должно быть так:
    1. native ShowPlayerDialog(playerid, dialogid, style, const caption[], const info[], const button1[], const button2[]);

    Из-за того, что массивы указаны без const, компилятор считает, что функция может записывать в них данные - как, например, с получением ника в GetPlayerName() (к слову, в этой функции массив наоборот объявлен с const - скорее всего, скопипастили заголовок из SetPlayerName() и тупо забыли const убрать). Из-за этого нельзя передавать в функцию неизменяемые массивы - компилятор выдаст несоответствие типов.

    Теперь об исправлении. Официального багфикса ждать, конечно же, глупо (смиритесь и продолжайте платить за Hosted, чтобы Kalcor и дальше мог ничего не делать!), но есть несколько сторонних решений:
    • fixes.inc
      Инклуд c костылями для обхода множества багов в SA-MP. С прошлого года пополнился исправленными заголовками функций.

    • samp-stdlib
      Набор модифицированных инклудов SA-MP. Официально они предназначены для инструмента sampctl, однако их можно использовать как прозрачную замену стандартным инклудам (т.е. просто закинуть в папку "pawno/include" с заменой).
      sampctl - довольно популярный инструмент среди зарубежных разработчиков, поэтому можно не бояться, что проект окажется заброшен и не обновится при выходе новых версий SA-MP.
      Не так давно я как раз добавил туда фикс const-корректности. Также стоит заметить, что скоро должны принять ещё один патч, который делает аргументы с размерами массивов необязательными (по ссылке есть примеры).


    P.S.: Переместил сообщения, вопрос явно заслуживает отдельной темы.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  3. 2 пользователя(ей) сказали cпасибо:
    Elrmrnt-Kritik (14.07.2018) Mavi (18.07.2018)
  4. #3
    Аватар для Elrmrnt-Kritik
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.11.2017
    Сообщений
    136
    Репутация:
    10 ±
    Из fixes.inc один баг заинтересовал меня с той точки зрения, что при помощи него можно получить и пользу - предотвратить респавн игрока при смерти.
    Код HTML:
    fix name= "OnPlayerDeath"
    problem Clients get stuck when they die with an animation applied.
    solution  Clear their animations. 
    Я правильно понял, если анимация из библиотеки "PED", то игрок не будет спавниться, а останется лежать на месте?

 

 

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

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

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

Ваши права

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