Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
Стол заказов:
Мои работы:
Не уверен, но похоже что ложное срабатывание диагностики. Например вот так:
Мы падаем в ветку else (т.к передана пустая строка). Там происходит какая-то логика. Но компилятор с нас просит const, хотя мы пишем в массив (если падаем в if ветку). Более "ходовой" пример с таким кодом можно глянуть в alternative dialogs, функция ShowPlayerAltDialog. С пустыми строками оно вызывается для закрытия диалога, как это можно сделать с ShowPlayerDialog.
Warning 239 выдаётся на 17-й строке из-за того, что в SomeFunction() передаётся строковый литерал.
Если сделать так:
static const empty_str[] = ""; SomeFunction(empty_str);
то никакого варнинга не будет.
Впрочем, можно ещё сделать вот так:
SomeFunction(_);
Что по сути тоже является передачей строкового литерала (который, естественно, может оказаться модифицирован внутри функции, т.к. аргумент без const), но компилятор не предупредит об этом.Попробую сегодня сделать об этом issue в репо компилятора, а пока что делать так, как в последнем примере, не рекомендую.
UPD: Это не баг, см. пост ниже.
Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
Стол заказов:
Мои работы:
Касаемо моего вчерашнего сообщения:
Немного покопался в коде компилятора и, как оказалось это не баг: в таких случаях компилятор не передаёт ссылку на строку напрямую, а сначала создаёт в куче копию строки/массива по умолчанию и уже её передаёт - эту копию можно безопасно модифицировать внутри функции.
Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
Стол заказов:
Мои работы:
"Неофициальный" релиз 3.10.10+ от 13.08.2022.
Скачать: 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 252 ("значение переменной изменено, но не используется") теперь работает для операторов ++, --, а также для составных операторов присвоения (+=, -=, *= и пр.)
AddOne(arg) { // переменная увеличена на единицу ПОСЛЕ передачи её значения в return, // т.е. её новое значение после инкремента никак не используется // (возможно, автор кода вместо "arg++" хотел написать "++arg" ?) return arg++; // warning 252: variable has its value modified but never used: "arg" }
- Диагностика warning 240 ("присвоенное значение не используется") теперь указывает на ту строку, на которой произошло предыдущее присвоение (которое не используется), а не текущее.
var = 1; // теперь warning 240 выводится для этой строки // ... var = 2; // раньше предупреждение указывало на эту строку, а предыдущее // присвоение приходилось выискивать самостоятельно
- Отменено введённое ранее требование на перечисление всех спецификаторов функции в последующих объявлениях и определении.
Пример:
forward public Func(); // В определении функции нет спецификатора "public", но компилятор не станет // считать это ошибкой, как было в предыдущем билде (05/2021). Func(){}
Тем не менее, всё ещё нельзя присваивать спецификаторы static и public после того, как функция уже определена.
Func() { // ... } // Функция уже определена, нельзя добавить к ней спецификатор "static" или "public" forward public Func(); // error 025: function heading differs from prototype // В то же время "stock" можно добавить даже после определения, т.к. он не влияет // на кодогенерацию и только подавляет предупреждение, если функция не используется forward stock Func(); // OK
- Исправлено ложное срабатывание warning 240 в редких случаях, когда внутри цикла с помощью goto совершался переход на метку, объявленную далее внутри того же цикла (пример).
- Исправлено падение компилятора, которое могло произойти из-за незавершённой конструкции do-while, в которой по ошибке забыто слово while.
main() { do {} // В цикле не хватает "while", но вместо того, чтобы вывести ошибку // об отсутствии ключевого слова, компилятор просто падал. }
- Исправлено игнорирование спецификации размера возвращаемого массива в объявлениях операторов.
По правилам языка операторы не могут возвращать массивы, однако изначальный разработчик компилятора забыл добавить для этого соответствующую проверку.
// теперь "[10]" в этом объявлении считается за ошибку, // как и должно было быть изначально native Tag:[10]operator+(Tag:a, Tag:b) = 0;
- Обеспечена сборка со статической библиотекой времени выполнения.
Это приведёт к увеличению размера файлов "pawncc.exe" и "pawnc.dll", однако теперь для работы компилятора не потребуется установка Visual C++ 2010 Runtime (нужные части библиотеки будут встроены в сам компилятор).
В стоковом компиляторе (распространяемом вместе с релизами SA-MP) не нужно ничего дополнительно устанавливать, поэтому логично чтобы и здесь не было этого требования.
Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
Стол заказов:
Мои работы:
Я начал пользоваться оператором "__emit" и заметил отсутствие макро-инструкций "*ref.u.alt/pri".
P.S. за статическую линковку VC++2010 отдельное спасибо.
Эту тему просматривают: 3 (пользователей: 0 , гостей: 3)