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];
Связаться со мной в VK можно через личные сообщения этой группы
Заказы не принимаю
Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
Великих идей полно, на них нет спроса.
Воплощение идеи в законченную игру требует долгой работы,
таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
Предложить идею просто, воплотить – вот в чём проблема
Steve Pavlina
Pro_Coder (16.10.2020)
Вы даже не представляете, сколько раз этот вопрос задавали разработчикам компилятора...
Ответ на самом деле предельно простой: 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 возвращает "размер" для чего-то, что на самом деле не является массивом.
Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
Стол заказов:
Мои работы:
Pro_Coder (16.10.2020)
У меня тут вопрос возник
Почему такой метод не работает, если {3, ...} должно заполнять все ячейки?PHP код:
new test_1[MAX_PLAYERS char] = {3, ...};
Или у вашего компилятора такой баг исправлен?
Связаться со мной в VK можно через личные сообщения этой группы
Заказы не принимаю
Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
Великих идей полно, на них нет спроса.
Воплощение идеи в законченную игру требует долгой работы,
таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
Предложить идею просто, воплотить – вот в чём проблема
Steve Pavlina
А в чем тогда отличие от фигурных скобках ?
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");
}
Последний раз редактировалось Pro_Coder; 23.10.2020 в 12:52.
А, извиняюсь. Ты же с битами хочешь работать. Тупанул.
Лучше пусть тебе Daniel_Cortez ответит, чтоб я чего-нибудь лишнего не сморозил.
Связаться со мной в VK можно через личные сообщения этой группы
Заказы не принимаю
Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
Великих идей полно, на них нет спроса.
Воплощение идеи в законченную игру требует долгой работы,
таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
Предложить идею просто, воплотить – вот в чём проблема
Steve Pavlina
Pro_Coder (23.10.2020)
В том, что с фигурными скобками производится доступ не к ячейкам, а к отдельным байтам массива.
Если нужно определённым значением инициализировать не ячейки, а все байты массива, то в Pawn это напрямую не сделать. Разве что можно попробовать изловчиться с чем-то вроде такого:
new test[MAX_PLAYERS char] = { 0x03030303, ... }; // 0x03030303 = (3 << 24) | (3 << 16) | (3 << 8) | 3
, либо вручную проинициализировать циклом.
Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
Стол заказов:
Мои работы:
Pro_Coder (24.10.2020)
"Неофициальный" релиз 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").
Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
Стол заказов:
Мои работы:
Эту тему просматривают: 2 (пользователей: 0 , гостей: 2)