Покажи строки на которые указывают ошибки
Вид для печати
pawn не поддерживает двумерный массив в enumPHP код:
p_Name[4][MAX_PLAYER_NAME + 1]
А ты не думал разобраться в том, что из себя на самом деле представляет enum?
Да и зачем хранить сразу 4 ника? Если это именно разные ники и использоваться при игре будет только один - логично хранить только его в памяти сервера, а остальные оставить в БД. Если же это просто несколько разновидностей одного и того же ника, то пихать их в такой "массив" - самая неудачная идея из всех возможных, ибо сам через пару месяцев будешь с трудом вспоминать какой именно индекс такого массива к какому нику относится. Гораздо лучше под каждый ник выделить свою константу, дав ей нормальное информативное имя, и работать с ней.
Ну и если всё же очень хочется извращений, то можно сделать так:
enum e_PLAYER_NAMES { PLAYER_NAME_1[MAX_PLAYER_NAME], PLAYER_NAME_2[MAX_PLAYER_NAME], PLAYER_NAME_3[MAX_PLAYER_NAME], PLAYER_NAME_4[MAX_PLAYER_NAME], }; enum e_pInfo { p_ID, p_Password[64 + 1], p_Salt[64 + 1], p_Name[e_PLAYER_NAMES] }; new pInfo[MAX_PLAYERS][e_pInfo];
Вы даже не представляете, сколько раз этот вопрос задавали разработчикам компилятора...
Ответ на самом деле предельно простой: enum - это не аналог struct из C/C++, это просто enum с расширенным синтаксисом в сравнение с теми же C и C++.
Например, такой код:
enum pInfo { pPassHash[64 + 1], pLevel };
- это всего лишь синтаксический сахар для
enum pInfo { pPassHash, pLevel = pPassHash + pInfo:(64 + 1) };
Единственная разница лишь в том, что для первого варианта "sizeof(player_info[pPassHash])" вернёт 65, а для 2-го - 1. Насколько знаю, это единственный случай, когда sizeof возвращает "размер" для чего-то, что на самом деле не является массивом.
У меня тут вопрос возник
Почему такой метод не работает, если {3, ...} должно заполнять все ячейки?PHP код:
new test_1[MAX_PLAYERS char] = {3, ...};
Или у вашего компилятора такой баг исправлен?
Почему же не работает?
https://i.imgur.com/UnmzbjT.png
А в чем тогда отличие от фигурных скобках ?
https://ibb.co/8r2Tp6JPHP код:
test_1{0}
PHP код:
new test_1[MAX_PLAYERS char] = {123, ...};
new test_2[MAX_PLAYERS char];
main() {
test_2{0} = 123;
print("\n\n\n\n\n");
printf("%i", test_1{0});
printf("%i", test_2{0});
print("\n\n\n\n\n");
}
А, извиняюсь. Ты же с битами хочешь работать. Тупанул.
Лучше пусть тебе Daniel_Cortez ответит, чтоб я чего-нибудь лишнего не сморозил.
В том, что с фигурными скобками производится доступ не к ячейкам, а к отдельным байтам массива.
Если нужно определённым значением инициализировать не ячейки, а все байты массива, то в Pawn это напрямую не сделать. Разве что можно попробовать изловчиться с чем-то вроде такого:
new test[MAX_PLAYERS char] = { 0x03030303, ... }; // 0x03030303 = (3 << 24) | (3 << 16) | (3 << 8) | 3
, либо вручную проинициализировать циклом.
"Неофициальный" релиз 3.10.10+ от 02.01.2021.
Скачать: 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
Изменения с момента предыдущего релиза:
- Добавлено 4 новых диагностики:
- warning 245: enum increment "%s" has no effect on zero value (symbol "%s")
Срабатывает, когда инкремент перечисления со знаком "<<=" или "*=" не имеет эффекта над элементом перечисления, равным нулю.
Обычно это является признаком ошибки, когда пользователь забыл указать значение для самого первого элемента перечисления.
// Допустим, разные достижения игрока хранятся в виде битовых флагов. enum ePlayerFlags (<<= 1) { // Пользователь забыл указать значение для pfEmailConfirmed, из-за чего элемент // перечисления оказался равен нулю. Инкремент будет бесполезен, т.к. (0 << 1) = 0. pfEmailConfirmed, // 0 pfTutorialCompleted, // warning 245: enum increment "<<= 1" has no effect on zero value (symbol "pfEmailConfirmed") };- warning 246: multiplication overflow in enum element declaration (symbol "%s")
Срабатывает, когда для перечисления указан инкремент со знаком "*=" и при объявлении очередного элемента перечисления из-за умножения происходит целочисленное переполнение.
enum (*= 1024) { eField1 = 1, eField2, // 1024 eField3, // 1048576 eField4, // 1073741824 eField5 // warning 246: multiplication overflow in enum item declaration (symbol "eField5") };- warning 247: use of operator "%s" on a "bool:" value(; did you mean to use operator "%s"?)
warning 247: use of operator "%s" on "bool:" values(; did you mean to use operator "%s"?)
Предупреждает о подозрительных операциях над логическими значениями (тег "bool:"), а также в некоторых случаях предлагает использовать правильный оператор, если есть возможность его угадать.
Пример:
new bool:success = Func(); if (~success) // warning 247: use of operator "~" on a "bool:" value; did you mean to use operator "!"?
В данном примере допущена опечатка: скорее всего, автор хотел использовать на значении с тегом "bool:" логическое отрицание (знак "!") вместо битовой инверсии ("~").
- warning 248: possible misuse of comma operator
Срабатывает, когда пользователь объединяет два выражения в одно с помощью знака ",", однако выражение перед запятой не имеет побочного эффекта (например, просто считывает значение из переменной), что может являться признаком ошибки.
// Опечатка: пользователь явно хотел использовать другой знак вместо "," // (скорее всего, это знак "<", т.к. он располагается на одной клавише с ",") if (x , y) { /* ... */ } // warning 248: possible misuse of comma operator
Данная диагностика работает только внутри контрольных выражений в if и switch, а также в условиях циклов.
- Исправлен баг, из-за которого компилятор не генерировал код для части выражения, если оно состоит из нескольких подвыражений, перечисляемых с помощью знака "," и последнее подвыражение имеет константный результат.
// Функция SendClientMessage() не вызывалась, т.к. компилятор не генерировал код // для всего, что было перед константной частью выражения (", 1")
- Убраны лишние сообщения warning 242 для ситуаций, когда для перечисления уже выдано сообщение warning 241.
enum (<<= 32) // warning 241: negative or too big shift count { eItem1 = 1, eItem2, // warning 242: shift overflow in enum item declaration (symbol "eItem2") eItem3 // warning 242: shift overflow in enum item declaration (symbol "eItem3") // Предупреждения о переполнении при сдвиге (warning 242) по сути верны, но // в данной ситуации они только лишний раз отвлекают пользователя, т.к. // компилятор уже предупредил о неправильном значении сдвига (warning 241). };- Исправлено отсутствие предупреждения, когда для аргумента-массива значение по умолчанию отличалось между объявлением и реализацией (или между двумя разными объявлениями).
forward Func(const a[] = { 1, 2, 3 }); stock Func(const a[] = { 3, 4, 5 }) // error 025: function heading differs from prototype return a[0];- Теперь компилятор выдаёт ошибку, когда #pragma warning push используется больше раз, чем #pragma warning pop (когда пользователь использует "push", но забывает восстановить прежнее состояние варнингов с помощью "pop"), и наоборот (т.е. использует "pop", забыв до этого использовать "push").
#pragma warning disable 238 #pragma warning push main(){} // error 001: expected token: "#pragma warning pop", but found "-end of file-"
#pragma warning pop // error 026: no matching "#pragma warning push" main(){}- Исправлены некорректные сообщения об ошибках, выдаваемые, когда вместо массива пользователь пытался получить элемент из одиночной переменной, либо когда переменной/массива с указанным названием не существовало.
main() { return arr[0]; // массив с именем "arr" не объявлен }
До исправления:
Правильным здесь является только первое сообщение (о неправильном идентификаторе, из которого пытаются получить элемент массива); остальные некорректны и являются результатом того, что наткнувшись на неподходящий/необъявленный идентификатор, компилятор не пытается обработать индексную часть ("[0]" в примере выше), а вместо этого сразу ожидает окончание выражения (символ ";").Код:test.pwn(2) : error 028: invalid subscript (not an array or too many subscripts): "var"
test.pwn(2) : warning 215: expression has no effect
test.pwn(2) : error 001: expected token: ";", but found "]"
test.pwn(2) : error 029: invalid expression, assumed zero
test.pwn(2) : fatal error 107: too many error messages on one line
После исправления компилятор выдаёт только одно корректное сообщение и не прерывает компиляцию из-за фатальной ошибки, продолжая анализировать код дальше.- Исправлены некорректные сообщения об ошибках, выдаваемые, когда пользователь пытался объявить локальную переменную с помощью ключевого слова stock (локальные переменные можно объявлять только с помощью спецификаторов new и static).
main() { stock x = 0; return x; }
До исправления:
После исправления компилятор выдаёт более понятное сообщение о неправильном объявлении:Код:test.pwn(2) : error 029: invalid expression, assumed zero
test.pwn(2) : error 017: undefined symbol "x"
test.pwn(2) : warning 215: expression has no effect
test.pwn(3) : error 017: undefined symbol "x"
, после чего не отвлекает пользователя лишними сообщениями из-за необъявленной переменной "x" (т.е. объявление обрабатывается корректно, как если бы оно было сделано с помощью ключевого слова new или static).Код:test.pwn(2) : error 010: invalid function or declaration
- Исправлено ложное срабатывание fatal error 103: insufficient memory, прерывающее компиляцию в случаях, когда из-за ошибки пользователя оператор case использовался вне конструкции switch (#574).
- Исправлено падение компилятора при попытке переобъявить корневую константу перечисления (#403).
- Исправлено отсутствие предупреждения при попытке переобъявить корневую константу пустого перечисления (#575).
- Исправлены ложные срабатывания warning 242 при использовании инкремента перечисления "<<= 0".
- Исправлены ложные срабатывания warning 240 на статических (static) локальных переменных.
- В тексте warning 218 ("old style prototypes used with optional semicolumns") исправлена опечатка ("semicolumns" => "semicolons").