О том, что у memcmp всего один аргумент count, а значит она может сравнивать массивы только при условии, что их длины одинаковы. Изначально разговор был про массивы разной длины.
Вид для печати
Не уверен, но похоже что ложное срабатывание диагностики. Например вот так:
Мы падаем в ветку else (т.к передана пустая строка). Там происходит какая-то логика. Но компилятор с нас просит const, хотя мы пишем в массив (если падаем в if ветку). Более "ходовой" пример с таким кодом можно глянуть в alternative dialogs, функция ShowPlayerAltDialog. С пустыми строками оно вызывается для закрытия диалога, как это можно сделать с ShowPlayerDialog.
Warning 239 выдаётся на 17-й строке из-за того, что в SomeFunction() передаётся строковый литерал.
Если сделать так:
static const empty_str[] = ""; SomeFunction(empty_str);
то никакого варнинга не будет.
Впрочем, можно ещё сделать вот так:
SomeFunction(_);
Что по сути тоже является передачей строкового литерала (который, естественно, может оказаться модифицирован внутри функции, т.к. аргумент без const), но компилятор не предупредит об этом.Попробую сегодня сделать об этом issue в репо компилятора, а пока что делать так, как в последнем примере, не рекомендую.
UPD: Это не баг, см. пост ниже.
Касаемо моего вчерашнего сообщения:
Немного покопался в коде компилятора и, как оказалось это не баг: в таких случаях компилятор не передаёт ссылку на строку напрямую, а сначала создаёт в куче копию строки/массива по умолчанию и уже её передаёт - эту копию можно безопасно модифицировать внутри функции.
"Неофициальный" релиз 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) не нужно ничего дополнительно устанавливать, поэтому логично чтобы и здесь не было этого требования.
Я начал пользоваться оператором "__emit" и заметил отсутствие макро-инструкций "*ref.u.alt/pri".
P.S. за статическую линковку VC++2010 отдельное спасибо.