Я и сам не фанат этого изменения, но сделано оно было не просто так.
Представим такую ситуацию:
#include <a_samp> PrintString(str[]) { str[0]++; } PrintHello() { PrintString("hello"); } main() { PrintHello(); PrintHello(); }
Если при первом вызове PrintHello() будет выведено "hello", как и задумывалось, то при втором строка уже будет искажена ("iello").
Проблема в том, что "hello" - это неизменяемый массив, объявленный на месте использования (т.е. внутри вызова PrintString()), но в то же время в функции PrintString() аргумент "str[]" является изменяемым (ибо перед ним нет const) - т.е. из-за недосмотра со стороны автора языка Pawn компилятор позволяет передать константный массив как изменяемый, а дальще функция PrintString() может делать с ним что угодно.
Для сравнения, если объявить "hello" явным образом (т.е. как именованный константный массив), компилятор не позволит передать его в PrintString():
PrintHello() { static const str[] = "hello"; PrintString(str); // error 035: argument type mismatch (argument 1) }
Советую не сеять панику, ещё и дня не прошло с момента релиза.
Более чем уверен, что в инклудах ошибки исправят быстро - либо это сделают сами авторы инклудов, либо другие заинтересованные в исправлении скриптеры.
К примеру, я уже создал PR с исправлениями для mxINI: https://github.com/Open-GTO/mxINI/pull/1
Исправить ошибки в своём коде, нет? (А именно ошибками они и являются. Хорошо ещё, что компилятор в таких ситуациях выдаёт только варнинги, а не ошибки, как с явно объявленными массивами.)
Пример исправления я показал выше.
На крайняк, если не хочется ждать, пока ошибки исправят в инклудах, можно в самое начало мода поставить такую заглушку:
#if defined __PawnBuild #if __Pawn == 0x3A && __PawnBuild >= 9 || __Pawn > 0x3A #pragma warning disable 214 #pragma warning disable 239 #endif #endif
хотя что-то мне подсказывает, что вместо крайнего решения эта заглушка станет раком похуже, чем #pragma tabsize 0.
Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
Стол заказов:
Мои работы:
Было 272 варнинга, полазил в парочке инклудов добавил const и уже их нет, на самом деле его легко фиксить, хорошая обновка, пойду ещё паблики прошерстю и туда подобавляю)0
UPD: Error 025 выдает, видно не судьбааа
Последний раз редактировалось Kovshevoy; 30.09.2018 в 14:29.
1) Есть разработчики, которые используют новый компилятор.
2) Стоп, я не говорил, что использовать const - неправильно. Не все разработчики библиотек будут это делать, поскольку есть те, которые уже не выкладывают обновления, а фиксить их же код ... Многие новые фичи можно отключить, но это предупреждение нельзя.
P.S. хотя бессмысленно продолжать данный диалог, лишь потому, что я уже не использую ни один компилятор.
Последний раз редактировалось VVWVV; 30.09.2018 в 14:38.
Ну, у меня лично более двухста варнингов было из-за инклуда easyDialog
Было:
stock Dialog_Open(playerid,function[], style,caption[],info[],button1[],button2[], {Float,_}:...)
Стало:
stock Dialog_Open(playerid, const function[], style, const caption[], const info[], const button1[], const button2[], {Float,_}:...)
Сразу минус 250 варнигов, фиксить чей-то код, всего лишь пятью символами в заголовке функции - думаю не такой тяжкий труд.
Я этого не говорил.
Так о том и речь, что варнинги вместо ошибок сделали чисто для совместимости - скрипты всё ещё компилируются, а сами варнинги и заглушить можно.
public-функции исправлять не нужно, для них варнинги 214 и 239 отключены.
P.S.: Может быть стоит создать отдельную тему со ссылками на самые популярные инклуды и плагины и там отслеживать их совместимость с последней версией компилятора?
Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
Стол заказов:
Мои работы:
Я не думаю, что это чисто ради совместимости. Было бы глупо видеть ошибку о работающем коде (он работает, но небезопасно).
Хм.. я либо уже забыл пуфн, либо паблик функции не содержат ошибок?
Было бы здорово.
p.s: странно, что скрытый выход за пределы массива еще не убрали.
Последний раз редактировалось VVWVV; 30.09.2018 в 14:56.
Эту тему просматривают: 6 (пользователей: 0 , гостей: 6)