Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 12 12311 ... ПоследняяПоследняя
Показано с 1 по 10 из 120
  1. #1
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,040
    Репутация:
    2435 ±

    Pawn compiler (3.10)

    Модифицированная версия компилятора Pawn с исправлением множества багов.

    Наиболее примечательные баги, которые были исправлены:
    • Ошибка на строках кода длиннее 511 символов (лимит увеличен до 4095).
    • Падение компилятора при использовании #emit sysreq.c, если указанная функция не использовалась ранее (с некоторых пор баг снова стал проявляться, однако новый патч #157 уже ждёт принятия).
    • Ошибка при использовании строк в тернарных выражениях.
    • Падение компилятора при использовании #emit call.
    • Падение компилятора из-за неправильного названия инструкции в #emit.
    • Условная компиляция (#if/#elseif/#else/#endif) не работала с директивой #emit.
    • Ошибка при передаче глобальной переменной в функцию до определения функции, из-за которой компилятор принимал переменную за неиспользуемую и удалял её из файла .amx (#131).


    Нововведения:
    • Добавлен ключ командной строки "-R", использование которого включает отображение отчёта о находящихся рекурсиях в скрипте (#121).

    • Добавлена поддержка отрицательных чисел и чисел с плавающей запятой в #emit (#128, #133).

    • Реализована возможность ограничивать видимость перечисления в пределах одного файла (удобно при создании инклудов).
      Пример:
      PHP код:
      static enum eMyEnum
      {
          
      myEnumFieldA,
          
      myEnumFieldB,
          
      myEnumFieldC
      }; 
    • Убрана автоматическая защита от повторного подключения включаемых файлов. Это было сделано из-за различий в работе такой защиты на разных ОС.
      Данную защиту можно включить, активировав режим совместимости с помощью флага "-Z" или директивы #pragma compat.

    • Новые встроенные константы:
      • __line - номер текущей строки в исходном файле;
      • __PawnBuild - номер текущего билда компилятора;
      • __compat - флаг режима совместимости: 1, если включена компиляция в режиме совместимости (с ключом -Z), иначе 0;
      • __file - содержит строку с названием текущего исходного файла (например, "main.pwn" или "my_include.inc");
      • __date, __time - содержат дату и время компиляции соответственно (время запуска компилятора).


    • Директива #pragma compat позволяет активировать режим совместимости, в котором включена автоматическая защита от повторного подключения файлов.

    • Добавлена возможность показывать предупреждающие сообщения с помощью директивы #warning, по аналогии с уже существующей директивой #error, но без прерывания компиляции:
      Пример:
      PHP код:
      #warning Эта строка будет выведена в отчёте компилятора 
      Результат:
      warning 237: user warning: Эта строка будет выведена в отчёте компилятора

    • Также реализована многофункциональная директива #pragma warning, с помощью которой можно отключать предупреждения компилятора (#pragma warning disable <номер>), а также запоминать/восстанавливать состояние активации предупреждений (#pragma warning push/pop).
      Пример:
      PHP код:
      #warning Эта строка будет выведена в отчёте компилятора

      #pragma warning push // Запоминаем состояние предупреждений
      #pragma warning disable 237 // Отключаем все пользовательские предупреждения (код 237)
      #warning Эта строка выведена не будет
      #pragma warning pop  // Восстанавливаем прежнее состояние

      #warning Эта строка тоже будет выведена 
      Результат:
      warning 237: user warning: Эта строка будет выведена в отчёте компилятора
      warning 237: user warning: Эта строка тоже будет выведена

    • Директива #pragma naked отключает предупреждения вида "function must return a value". Отличие от #pragma warning disable в том, что #pragma naked действует только в пределах одного файла.
      Данная возможность может пригодиться при использовании #emit retn. Добавление return 1 в таких случаях тоже скроет предупреждение, но приведёт к генерации неиспользуемого (недостижимого) байткода.

    • Добавлена прогрессивная инициализация для двухмерных массивов.
      Пример (взято отсюда):
      PHP код:
      new a[5][10] = {{012, ...}, {024, ...}, ...}; 
      В полной записи данный массив будет выглядеть так:
      PHP код:
      new a[5][10] = {
          {
      012,  3,  4,  5,  6,  7,  8,  9},
          {
      024,  6,  8,  1012141618},
          {
      036,  9,  121518212427},
          {
      048,  12162024283236},
          {
      051015202530354045}
      }; 
    • Также реализована возможность объявления четырёхмерных массивов (ранее был лимит в 3 измерения).
      Пример:
      PHP код:
      new arr[3][1][2][3] =
      {
          { { {  
      1,  2,  }, {  4,  5,  } } },
          { { {  
      7,  8,  }, { 101112 } } },
          { { { 
      131415 }, { 161718 } } }
      }; 
    • Добавлен новый оператор emit/__emit.
      С описанием работы данного оператора можно ознакомиться здесь.
      (Примечание (DC): В скором времени будет подготовлена русскоязычная статья по использованию оператора emit, я добавлю ссылку сюда по мере готовности.)

    • Ускорена компиляция больших массивов, все элементы которых инициализированы одним и тем же значением.
      Теперь в ассемблерном листинге подобные массивы записываются как "dumpn <кол-во> <значение>".

    • Теперь при возврате массивов неизвестного размера компилятор выдаёт ошибку.
      Пример:
        Открыть/закрыть

      PHP код:
      #include <a_samp>

      GetGenderName(gender_id)
      {
          static const 
      gender_names[3][] = { {"male"}, {"female"}, {"undefined"} };
          if (
      == gender_id)
              return 
      gender_names[0];
          if (
      == gender_id)
              return 
      gender_names[1];
          return 
      gender_names[2];
      }

      main()
      {
          for (new 
      03; ++i)
              
      printf("#%d: %s"iGetGenderName(i)); // error 092: functions may not return arrays of unknown size (symbol "GetGenderName")


      Здесь компилятор выдаёт ошибку из-за того, что не знает размер последнего измерения массива gender_names. Чтобы устранить ошибку, достаточно лишь указать размер последнего измерения массива:
      Код:
      static const gender_names[3][10] = { {"male"}, {"female"}, {"undefined"} };
    • Значительно ускорена обработка исходного кода за счёт хранения глобальных идентификаторов (переменных, констант, функций) в хеш-таблице.

    • Добавлен параметр командной строки "-E" для интерпретации предупреждений от компилятора как ошибок.

    • Добавлена директива #pragma option, с помощью которой можно указывать параметры командной строки из скрипта.

    Скачать: https://github.com/Zeex/pawn/releases
    Исходный код на GitHub: https://github.com/Zeex/pawn

    Источники информации: What's new, Known compiler bugs
    Статью подготовил: Daniel_Cortez

    Отдельная благодарность ziggi за описания некоторых ошибок и нововведений.

    Специально для Pro-Pawn.ru
    Копирование данной статьи на других порталах без разрешения автора запрещено!
    Последний раз редактировалось Daniel_Cortez; 24.05.2013 в 20:15.
    Индивидуально в PM и Skype по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  2. 7 пользователя(ей) сказали cпасибо:
    HarrWe (15.07.2016)Osetin (24.05.2013)Ruskadance (23.06.2013)seriu (05.11.2017)vovandolg (24.03.2017)Web (08.09.2018)Геннадий Литвинов (10.09.2019)
  3. #2
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    779 ±
    v3.10.1
    Build 1

    Начиная с этого релиза, в версии компилятора располагается номер сборки вместо даты, то есть "1" в "3.10.1" означает "build 1". Номер сборки будет увеличиваться с каждым релизом.

    Изменения относительно предыдущей версии:
    • Исправлена ошибка при передаче глобальной переменной в функцию до определения функции, что вызывало удаление переменной из AMX файла как неиспользуемую (#131)
    • Добавлена опция -R использование которой включает отображение отчёта о находящихся рекурсиях в скрипте (#121)
    • Добавлена поддержка отрицательных чисел и чисел с плавающей запятой в #emit (#128, #133)
    • Добавлена константа __PawnBuild которая содержит номер сборки текущей версии компилятора (#132)


    https://github.com/Zeex/pawn/releases

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,040
    Репутация:
    2435 ±
    Ещё с прошлой недели понемногу готовлю обновление для сей статьи - сегодня-завтра собираюсь закончить, благо появилось свободное время. Не против, если использую часть твоего текста?

    UPD: Буквально пару минут назад внесён коммит, добавляющий константы __file, __date и __time.
    Индивидуально в PM и Skype по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  5. #4
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    779 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Не против, если использую часть твоего текста?
    Конечно не против.

    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    UPD: Буквально пару минут назад внесён коммит, добавляющий константы __file, __date и __time.
    О, это довольно полезно.

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,040
    Репутация:
    2435 ±
    Обновил статью. Знаю, что обещал ещё месяц назад; личные обстоятельства внесли свои коррективы.
    По поводу самой статьи - вполне возможно, что упустил что-нибудь, особенно на фоне того, что у меня сейчас 2 часа ночи. Дайте знать, если заметили какой-нибудь недочёт или ошибку.
    Индивидуально в PM и Skype по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  7. #6
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,254
    Репутация:
    1859 ±
    Добавлена возможность выводить пользовательские ошибки с помощью директивы #error.
    Так это же, вроде, и в "дэфолтном" компиляторе есть, не?
    Связаться со мной в VK можно через личные сообщения этой группы

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  8. #7
    Аватар для Alpano
    Пользователь

    Статус
    Оффлайн
    Регистрация
    06.02.2017
    Сообщений
    122
    Репутация:
    16 ±
    recursion detected: function 40000004!=40000004 directly calls itself
    recursion detected: function 40000004/0 directly calls itself
    recursion detected: function 40000004*0 indirectly calls itself:
    40000004*0 <- AntySH <- 40000004*0
    recursion detected: function -40000004 indirectly calls itself:
    -40000004 <- GetCoordBonnetVehicleEx <- -40000004
    recursion detected: function AddOshive indirectly calls itself:
    AddOshive <- UpdDBM <- AddOshive
    ...
    И как понять где рекурсия?)
    p.s. и ещё, функции AddOshive и UpdDBM ОБСАЛЮТНО не связаны... почему на них может ругаться?
    MyProject:
    DriftEmpire©

    Ленивые всё делают быстро, чтобы поскорее избавиться от работы.
    И делают качественно, чтобы потом не переделывать.

  9. #8
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,254
    Репутация:
    1859 ±
    Забавно...
    Должно быть что-то типа такого:
      Открыть/закрыть
    Связаться со мной в VK можно через личные сообщения этой группы

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  10. #9
    Аватар для VVWVV
    Модератор

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    728
    Репутация:
    345 ±
    Падение компилятора при использовании #emit sysreq.c, если указанная функция не использовалась ранее.
    Она до сих по не исправлена (я тестировал версию из мастер-ветки), поэтому буквально десять дней назад я отправил PR с исправлением, который до сих пор не приняли.

  11. #10
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    779 ±
    Цитата Сообщение от Alpano Посмотреть сообщение
    И как понять где рекурсия?)
    p.s. и ещё, функции AddOshive и UpdDBM ОБСАЛЮТНО не связаны... почему на них может ругаться?
    Покажи код.

 

 
Страница 1 из 12 12311 ... ПоследняяПоследняя

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

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

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

Метки этой темы

Ваши права

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