@Daniel_Cortez, а этот баг до сих пор не исправлен?
https://github.com/pawn-lang/compiler/issues/181
https://github.com/pawn-lang/compiler/issues/350
Если нет, то возможно, что ты захочешь исправить в своей версии компилятора?
Последний раз редактировалось tnc; 13.07.2020 в 18:58.
Если вкратце, не углубляясь в суть бага, то придётся переписывать очень много кода (а именно - заставить компилятор хранить препроцессированные тексты в UTF-8 вместо того, чтобы переключаться между разными кодировками), и я сомневаюсь, что исправление вообще примут, судя по тому, как в репо компилятора до сих пор висят полтора десятка куда более простых PRов.
Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
Стол заказов:
Мои работы:
окей, если фикс не прокатит в upstream, то может быть стоит, хотя-бы сделать диагностику этого? Ибо на днях, я столкнулся с этой проблемой и потратил 5 минут, чтобы понять, почему перестал компилироваться мод. Я знал об этом баге, но что если новички, которые не знают об этом баге? Они потратят много времени, чтобы найти почему компилятор ушел в infinite loop (это новая версия от pawn-lang, дефолтный компилятор 3.2 (который поставляется с сервером скорее всего вообще крашнит)
Во-первых, багу подвержены все версии компилятора, и последний релиз 3.10.10 может крашнуть примерно с такой же вероятностью, как и стоковый 3.2.3664.
Во-вторых, даже если и рассматривать вариант с диагностикой как временную меру, пока что я не уверен, как такую диагностику можно было бы реализовать в более-менее приемлемом виде. Если добавить её как простой варнинг, компилятор всё равно будет крашить; если же сделать её как fatal error - это предотвратит краш путём прерывания компиляции, но будет выглядеть избыточным ради одного бага.
В-третьих, есть куча других багов, которые нужно исправить, и фич, которые я хотел бы добавить к следующему релизу компилятора, и на всё это мне приходится тратить своё личное время. Именно поэтому пока что я занимаюсь теми багами, которые я знаю, как исправить, и фичами, которые я знаю, как реализовать. Касаемо бага с кодировками, возможно, получится исправить его позже (например, если вдруг удастся наткнуться на более-менее простое решение во время исправления другого бага - такое уже бывало, и не раз).
Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
Стол заказов:
Мои работы:
"Неофициальный" релиз 3.10.10+ от 06.09.2020.
Скачать: 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
- Улучшены диагностики для обнаружения недостижимого кода ("warning 225: unreachable code").
Теперь компилятор умеет находить "мёртвый" код в следующих случаях:
- Когда все case в switch (в том числе default) заканчиваются оператором "return", "break", "continue" или любым другим "завершающим" оператором:
switch (value) { case 0: return 0; case 1..10: return 2; default: { return 3; } } return 4; // warning 225: unreachable code
- Когда разные ветви if заканчиваются разными видами "завершающих" операторов:
new x; do { if (x) break; else continue; x++; // warning 225: unreachable code } while (x);
Раньше компилятор замечал недостижимый код только когда обе ветви if заканчивались одинаковыми операторами (например, обе на return).
- После оператора goto, когда дальше нет никаких меток и можно точно определить, что дальнейший код никогда не выполнится:
label_1: goto label_1; return 0; // warning 225: unreachable code
- Исправлен баг, из-за которого можно было совершать присвоения к константным многомерным массивам.
new const a[1][1]; a[0][0] = 0; // такой код компилировался без ошибок, несмотря на то, // что массив должен быть неизменяемым ("const")
Отдельное спасибо DeimoS'у за то, что сообщил о данном баге.
- Исправлен баг, связанный с возвратом массивов из функций напрямую.
ReturnString0() { return "abc"; } ReturnString1() { // при повторном возврате массива, возвращённого напрямую из другой функции, генерировался // неправильный байткод, приводящий к сбою (ошибке времени выполнения) на сервере return ReturnString0(); }
Подробнее об этом баге можно узнать из статьи "Почему не следует возвращать строки/массивы напрямую".
- Исправлен баг, из-за которого компилятор при использовании тернарного оператора на массивах не учитывал размер 3-го аргумента.
static const str1[] = "123", str2[] = "12"; new result[3]; new x = 0; // данный код компилируется с ошибкой, т.к. массив "result" слишком мал, чтобы вместить строку "123" result = x ? str1 : str2; // error 047: array sizes do not match, or destination array is too small // однако такой код компилировался без единой ошибки или даже варнинга result = x ? str2 : str1;
- Исправлены баги, из-за которых компилятор ошибочно считал код недостижимым
- когда в ветвлении if ветвь true заканчивается на return, а ветвь false пустая:
new const bool:TRUE = true; if (TRUE) { return 1; } else {} return 0; // warning 225: unreachable code
- когда после ветвления, обе ветви которого заканчиваются на return, следует метка, использованная ранее через goto:
new var = 0; if (var == 0) goto label_1; if (var != 0) return 0; else return 1; label_1: // warning 225: unreachable code return 2; // на самом деле этот код достижим, поскольку ранее // был совершён переход ("goto") на метку "label_1"
- Устранён недочёт, из-за которого компилятор позволял объявлять операторы с атрибутом public.
Пример:
public operator=(Tag:a) return _:a;
Очевидно, что атрибут public по идее не должен быть применим к операторам, однако раньше такой код компилировался без единого варнинга. Теперь же компилятор не позволит этого сделать:
Код:error 056: arrays, local variables, function arguments and user-defined operators cannot be public (symbol "operator =(Tag:)")
Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
Стол заказов:
Мои работы:
Касаемо модифицированных инклудов - в той версии, которая прикреплена, не исправлена const-корректность для многих функций. Она исправлена только для инклудов версии 0.3DL. При этом, релизная версия иклудов под 0.3DL тоже устарела. Свежую версию можно получить только при загрузке архива с основной веткой - https://github.com/pawn-lang/samp-st...ive/master.zip. Правда, опять же, тут включены функции для 0.3DL.
Связаться со мной в VK можно через личные сообщения этой группы
Заказы не принимаю
Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
Великих идей полно, на них нет спроса.
Воплощение идеи в законченную игру требует долгой работы,
таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
Предложить идею просто, воплотить – вот в чём проблема
Steve Pavlina
Это довольно давно известно (https://github.com/pawn-lang/samp-stdlib/issues/27) и даже с того момента ничего не предпринято
Не хотите постоянно проверять обновления моих скриптов?
Подключите его последним, после всех остальных
Nexius's Update Checker
Связаться со мной в VK можно через личные сообщения этой группы
Заказы не принимаю
Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
Великих идей полно, на них нет спроса.
Воплощение идеи в законченную игру требует долгой работы,
таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
Предложить идею просто, воплотить – вот в чём проблема
Steve Pavlina
Вы не думали, почему бы не сделать двумерный массив для enum ?
https://pro-pawn.ru/showthread.php?1...ll=1#post61896
Например, я хотел хранить несколько имен в p_Name[4][MAX_PLAYER_NAME + 1] , но мне выдает ошибка
PHP код:
enum e_pInfo {
p_ID,
p_Password[64 + 1],
p_Salt[64 + 1],
p_Name[4][MAX_PLAYER_NAME + 1]
};
new pInfo[MAX_PLAYERS][e_pInfo];
Код HTML:error 001: expected token: "}", but found "[" error 010: invalid function or declaration
Эту тему просматривают: 5 (пользователей: 0 , гостей: 5)