Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 21 из 22 ПерваяПервая ... 11 19 20 21 22 ПоследняяПоследняя
Показано с 201 по 210 из 216
  1. #201
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2590 ±
    "Неофициальный" релиз 3.10.10+ от 02.05.2021.

    Скачать: https://www.dropbox.com/s/v5gvuwi0s2...0.10x.zip?dl=1
    Модифицированные инклуды SA-MP: https://github.com/pawn-lang/samp-st...3.7-R2-1-1.zip
    Исходный код: https://github.com/Daniel-Cortez/paw...e/master-fixes

    Изменения с момента предыдущего релиза:
    • Добавлены новые диагностики для обнаружения бесконечных циклов:
      • warning 250: variable "%s" used in loop condition not modified in loop body
        Буквально переводится как "переменная, используемая в условии цикла, не модифицируется в теле цикла".
        Помогает обнаружить ошибки, когда пользователь забыл сделать инкремент/декремент счётчика цикла.
        1. new i = 0;
        2. while (i < 10) // warning 250: variable "i" used in loop condition not modified in loop body
        3. DoSomething(i);

      • warning 251: none of the variables used in loop condition are modified in loop body
        Переводится как "ни одна из переменных, используемых в условии цикла, не модифицируется в теле цикла".
        То же самое, что и предыдущая диагностика, но срабатывает, когда в условии цикла используется несколько переменных - в таких случаях компилятор не может знать, какая именно переменная является счётчиком цикла, потому и возникла необходимость сделать отдельный варнинг с другой формулировкой.
        1. for (new m = 0, n = 10; m < n; ) // warning 251: none of the variables used in loop condition are modified in loop body
        2. DoSomething(m);


    • Исправлен баг, из-за которого при операциях инкремента/декремента ("++" и "--", как в пре-, так и в постфиксной форме) компилятор не регистрировал изменение значения в переменных и массивах и выдавал ложное предупреждение "warning 214: possibly a "const" array argument was intended".
      1. ClearString(arr[])
      2. {
      3. arr[0]++;
      4. // В массиве arr[] было изменено значение, однако компилятор всё равно предлагал
      5. // заменить "arr[]" в заголовке функции на "const arr[]".
      6. } // warning 214: possibly a "const" array argument was intended (symbol "arr")


    • Исправлена неправильная кодогенерация для вариативных аргументов функций (как, например, в printf() или format()), модифицируемых с помощью операторов "++" и "--".
      1. main()
      2. {
      3. new a[1] = { 0 };
      4. printf("%d", a[0]); // Без "++"/"--" значение a[0] ("0") выводится правильно
      5. printf("%d", a[0]++); // Но из-за "++" вместо "0" выводилось неправильное (мусорное) значение
      6. }

    • Введены более строгие правила для заголовков функций (т.е. как для объявлений, так и для определений):
      • Если в заголовке присутствует спецификатор класса, то определение функции тоже должно содержать этот спецификатор.
        1. forward Func1();
        2. public Func1(); // Введён классовый спецификатор "public"; компилятор будет требовать его в определении функции.
        3. Func1(); // OK (введённые ранее классовые спецификаторы являются обязательными только в определении,
        4. // в повторных объявлениях их можно пропустить).
        5. Func1(){} // Ошибка (нет спецификатора "public").
        6.  
        7. static Func2(); // Введён спецификатор "static".
        8. forward stock Func2(); // Введён спецификатор "stock"; теперь определение должно содержать
        9. // оба ключевых слова - как "static", так и "stock".
        10. stock static Func2(){} // OK (оба спецификатора на месте).

      • Повторные forward-объявления после определения функции не могут вводить новые классовые спецификаторы.
        1. stock Func(){} // После определения функция "финализирована", введение новых спецификаторов запрещено.
        2. forward public Func(); // Ошибка (функция не была объявлена как "public").

      Цель новых правил - исключить труднодиагностируемые случаи, когда классовые спецификаторы не имеют эффекта или приводят к неправильной кодогенерации (см. #621, #624).

    • Исправлен баг, из-за которого в forward-объявлениях компилятор ожидал тег функции перед классовыми спецификаторами.
      1. // Такое объявление компилируется без ошибок, как и положено
      2. forward public Func();
      3.  
      4. // Однако с тегом компилятор уже считал заголовок функции неправильным
      5. forward public Tag:Func(); // error 010: invalid function or declaration
      6.  
      7. // В то время, как такой заголовок, на удивление, компилировался без ошибок
      8. forward Tag:public Func();

    • Исправлен недочёт с отсутствием поддержки 2 и более классовых спецификаторов в forward-объявлениях.
      1. // Такое объявление компилировалось без ошибок.
      2. forward static Func1();
      3.  
      4. // Однако такое приводило к ошибке "error 010: invalid function or declaration"
      5. forward static stock Func2();

    • Исправлен недочёт, из-за которого компилятор не прерывал компиляцию, если точка входа в скрипт (функция main()) объявлена, но не реализована.
      1. main(); // Функция main() объявлена, но не реализована. Из-за недочёта такой скрипт
      2. // компилировался без единой ошибки, но с неправильной точкой входа.

    • Исправлен баг, из-за которого компилятор позволял объявлять со спецификатором static переменные, названия которых начинаются на "@".
      1. // Комбинация спецификаторов "public" и "static" в заголовках функций
      2. // считается неправильной, т.к. public-функция не может быть статической.
      3. static public Func1(){} // error 042: invalid combination of class specifiers
      4.  
      5. // Имя, начинающееся на "@", означает, что функция/переменная с таким именем
      6. // является публичной, как если бы она была объявлена со спецификатором "public".
      7. // Соответственно, комбинация из имени на "@" и спецификатора "static" тоже
      8. // считается неправильной.
      9. static @Func2(){} // error 042: invalid combination of class specifiers
      10.  
      11. // Однако из-за недочёта компилятор пропускал такую комбинацию для переменных.
      12. static @var = 0;

    • Теперь компилятор выводит warning 231 ("state specification on forward declaration is ignored") для объявлений функций не только в новом, но и в старом стиле (без ключевого слова forward).
      1. // Суть warning 231 в том, что спецификации состояний автоматонов (state)
      2. // имеют эффект только в реализации фукции, а в заголовках они бесполезны.
      3. forward Func() <auto1:st1>; // warning 231: state specification on forward declaration is ignored
      4.  
      5. // Однако для объявлений в старом стиле (без ключевого слова "forward")
      6. // такое предупреждение не выдавалось.
      7. Func() <auto1:st1>;

    • Исправлен баг, из-за которого операторы "++" и "--" не имели эффекта на результатах псевдо-инструкций "load.u.pri/alt" и "push.u" (см. #568).

    • Исправлен трудноуловимый баг, из-за которого вместо перегруженного оператора "--" использовался "++".
      1. // Оператор "++" не используется. Компилятор должен предупредить об этом (warning 203),
      2. // однако вместо этого предупреждение выводилось для оператора "--".
      3. Tag:operator ++(Tag:oper)
      4. return Tag:(_:oper + 1);
      5.  
      6. // Оператор "--" используется в main(), но для него всё равно выводится warning 203.
      7. Tag:operator --(Tag:oper) // warning 203: symbol is never used: "operator--(Tag:)"
      8. return Tag:(_:oper - 1);
      9.  
      10. main()
      11. {
      12. new Tag:x = Tag:0;
      13. --x--;
      14. }

      Проблема заключалась в том, что из-за особенностей реализации обработчики для "++" и "--" в компиляторе были пустыми - в релизных билдах они объединялись в одну функцию (этот и многие другие методы агрессивной оптимизации - обычное дело для многих компиляторов C/C++), из-за чего компилятор Pawn вместо перегруженного оператора "++" генерировал вызов для "--" (см. комментарий к #627).

    • Исправлен баг, в редких случаях приводивший к падению компилятора (см. #398).
      Проблема была обнаружена ещё 2 года назад, однако её решение затрудняло то, что она проявлялась крайне редко и только в сборках для Linux и OS X.

    P.S.: Всем удачных майских выходных! Особенно тем, кому тоже повезло с 10-дневными "каникулами" =)
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  2. 10 пользователя(ей) сказали cпасибо:
    DeimoS (03.05.2021) execution (04.05.2021) ihNNNNNify (13.05.2021) Pa4enka (02.05.2021) Pro_Coder (22.05.2021) punkochel (14.05.2021) seriu (06.09.2021) Seviel (06.05.2021) Shaolinka (02.05.2021) Web (02.05.2021)
  3. #202
    Аватар для Falcon
    Пользователь

    Статус
    Оффлайн
    Регистрация
    14.05.2021
    Сообщений
    1
    Репутация:
    0 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    "Неофициальный" релиз 3.10.10+ от 02.05.2021.
    Модифицированные инклуды SA-MP: https://github.com/pawn-lang/samp-st...3.7-R2-1-1.zip
    По-моему инклуды здесь не модифицированные

    Еще хотелось бы спросить на счет OnPlayerCommandText: При использовании кода
    Код HTML:
    OnPlayerCommandText(playerid, "/command")
    дабы вызвать этот паблик, мы получаем варнинг:
    Код HTML:
    warning 239: literal array/string passed to a non-const parameter
    Вопрос: Это баг ? (Потому что сам public не вызывает warning, только его использование как функции)

    Если нет, то как лучше поступить:
    Модифицировать инклуд (задать cmdtext[] как const), тем самым избавиться от варнинга (при этом сам паблик продолжает работать нормально) ?
    Или же стоит вообще не использовать OnPlayerCommandText как вызов функции с заданными параметрами (Даже не знаю корректен ли такой код) ?

  4. #203
    Аватар для Fallen A.
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.09.2015
    Адрес
    Минск, БССР
    Сообщений
    236
    Репутация:
    19 ±
    Цитата Сообщение от Falcon Посмотреть сообщение
    По-моему инклуды здесь не модифицированные

    Еще хотелось бы спросить на счет OnPlayerCommandText: При использовании кода
    Код HTML:
    OnPlayerCommandText(playerid, "/command")
    дабы вызвать этот паблик, мы получаем варнинг:
    Код HTML:
    warning 239: literal array/string passed to a non-const parameter
    Вопрос: Это баг ? (Потому что сам public не вызывает warning, только его использование как функции)

    Если нет, то как лучше поступить:
    Модифицировать инклуд (задать cmdtext[] как const), тем самым избавиться от варнинга (при этом сам паблик продолжает работать нормально) ?
    Или же стоит вообще не использовать OnPlayerCommandText как вызов функции с заданными параметрами (Даже не знаю корректен ли такой код) ?
    И то, и другое.

  5. #204
    Аватар для tnc
    Пользователь

    Статус
    Оффлайн
    Регистрация
    01.09.2019
    Сообщений
    121
    Репутация:
    26 ±
    Хотелось бы ещё узнать насколько будет проблематично разрешить в перегрузке операторов принимать массивы? Можно ли добиться такого результата?

    1. stock bool:operator==(oper1[], oper2[])
    2. {
    3. return strcmp(oper1, oper2) == 0;
    4. }


    Если это возможно с минимальными изменениями в коде, то почему бы не дать такую возможность?
    Последний раз редактировалось tnc; 29.05.2021 в 03:33.

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2590 ±
    Цитата Сообщение от tnc Посмотреть сообщение
    Хотелось бы ещё узнать насколько будет проблематично разрешить в перегрузке операторов принимать массивы? Можно ли добиться такого результата?

    1. stock bool:operator==(oper1[], oper2[])
    2. {
    3. return strcmp(oper1, oper2) == 0;
    4. }


    Если это возможно с минимальными изменениями в коде, то почему бы не дать такую возможность?
    Очень проблематично. Если для массивов не предусмотрено даже обычных, не перегруженных операций (за единственным исключением в виде присвоения), то о каких перегрузках может идти речь?
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

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

    Статус
    Оффлайн
    Регистрация
    01.09.2019
    Сообщений
    121
    Репутация:
    26 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Очень проблематично. Если для массивов не предусмотрено даже обычных, не перегруженных операций (за единственным исключением в виде присвоения), то о каких перегрузках может идти речь?
    Т.е: альтернативного сравнения не ждать? И никак его не реализовать? (кроме как через #emit и получения адрес, как это сделано в tdw_string)

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2590 ±
    Цитата Сообщение от tnc Посмотреть сообщение
    Т.е: альтернативного сравнения не ждать? И никак его не реализовать? (кроме как через #emit и получения адрес, как это сделано в tdw_string)
    Как ты представляешь себе сравнение массивов разной длины? Если со строками эта задача более-менее стандартизирована (есть функция strcmp(), которая возвращает -1, 0 или 1, причём аналогичная функция есть также в C и C++), то как быть, если один массив длиннее другого? Сравнивать первым делом длины массивов, или же содержимое (пока один из массивов не закончится)?
    Под эту задачу нет общепринятого стандарта, поэтому ни в Pawn, ни в его "старших братьях" C и C++ решения "из коробки" нет и не предвидится. Да и не настолько это частая задача, чтобы требовать какого-то своего стандарта. К слову, подобного рода проблемы и с оператором возведения в степень (помню, кто-то не так давно предлагал такую идею), который в Pawn тоже вряд ли появится.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  9. #208
    Аватар для tnc
    Пользователь

    Статус
    Оффлайн
    Регистрация
    01.09.2019
    Сообщений
    121
    Репутация:
    26 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Как ты представляешь себе сравнение массивов разной длины? Если со строками эта задача более-менее стандартизирована (есть функция strcmp(), которая возвращает -1, 0 или 1, причём аналогичная функция есть также в C и C++), то как быть, если один массив длиннее другого? Сравнивать первым делом длины массивов, или же содержимое (пока один из массивов не закончится)?
    Под эту задачу нет общепринятого стандарта, поэтому ни в Pawn, ни в его "старших братьях" C и C++ решения "из коробки" нет и не предвидится. Да и не настолько это частая задача, чтобы требовать какого-то своего стандарта. К слову, подобного рода проблемы и с оператором возведения в степень (помню, кто-то не так давно предлагал такую идею), который в Pawn тоже вряд ли появится.
    Эмм, а разве memcmp не подойдет?

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2590 ±
    Цитата Сообщение от tnc Посмотреть сообщение
    Эмм, а разве memcmp не подойдет?
    А разве в ней есть аргумент для размера второго массива?
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  11. #210
    Аватар для tnc
    Пользователь

    Статус
    Оффлайн
    Регистрация
    01.09.2019
    Сообщений
    121
    Репутация:
    26 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    А разве в ней есть аргумент для размера второго массива?
    Приведи пример, где это нужно, пока что не понимаю о чем ты

 

 
Страница 21 из 22 ПерваяПервая ... 11 19 20 21 22 ПоследняяПоследняя

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

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

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

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

Ваши права

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