Ага, все вопрос снят, спасибо.
Вид для печати
@Daniel_Cortez, а этот баг до сих пор не исправлен?
https://github.com/pawn-lang/compiler/issues/181
https://github.com/pawn-lang/compiler/issues/350
Если нет, то возможно, что ты захочешь исправить в своей версии компилятора?
Если вкратце, не углубляясь в суть бага, то придётся переписывать очень много кода (а именно - заставить компилятор хранить препроцессированные тексты в UTF-8 вместо того, чтобы переключаться между разными кодировками), и я сомневаюсь, что исправление вообще примут, судя по тому, как в репо компилятора до сих пор висят полтора десятка куда более простых PRов.
окей, если фикс не прокатит в upstream, то может быть стоит, хотя-бы сделать диагностику этого? Ибо на днях, я столкнулся с этой проблемой и потратил 5 минут, чтобы понять, почему перестал компилироваться мод. Я знал об этом баге, но что если новички, которые не знают об этом баге? Они потратят много времени, чтобы найти почему компилятор ушел в infinite loop (это новая версия от pawn-lang, дефолтный компилятор 3.2 (который поставляется с сервером скорее всего вообще крашнит)
Во-первых, багу подвержены все версии компилятора, и последний релиз 3.10.10 может крашнуть примерно с такой же вероятностью, как и стоковый 3.2.3664.
Во-вторых, даже если и рассматривать вариант с диагностикой как временную меру, пока что я не уверен, как такую диагностику можно было бы реализовать в более-менее приемлемом виде. Если добавить её как простой варнинг, компилятор всё равно будет крашить; если же сделать её как fatal error - это предотвратит краш путём прерывания компиляции, но будет выглядеть избыточным ради одного бага.
В-третьих, есть куча других багов, которые нужно исправить, и фич, которые я хотел бы добавить к следующему релизу компилятора, и на всё это мне приходится тратить своё личное время. Именно поэтому пока что я занимаюсь теми багами, которые я знаю, как исправить, и фичами, которые я знаю, как реализовать. Касаемо бага с кодировками, возможно, получится исправить его позже (например, если вдруг удастся наткнуться на более-менее простое решение во время исправления другого бага - такое уже бывало, и не раз).
"Неофициальный" релиз 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:)")
Касаемо модифицированных инклудов - в той версии, которая прикреплена, не исправлена const-корректность для многих функций. Она исправлена только для инклудов версии 0.3DL. При этом, релизная версия иклудов под 0.3DL тоже устарела. Свежую версию можно получить только при загрузке архива с основной веткой - https://github.com/pawn-lang/samp-st...ive/master.zip. Правда, опять же, тут включены функции для 0.3DL.
Это довольно давно известно (https://github.com/pawn-lang/samp-stdlib/issues/27) и даже с того момента ничего не предпринято
Вы не думали, почему бы не сделать двумерный массив для 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