Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 19 из 22 ПерваяПервая ... 9 17 18 19 20 21 ... ПоследняяПоследняя
Показано с 181 по 190 из 216
  1. #181
    Аватар для ihNNNNNify
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.09.2018
    Сообщений
    17
    Репутация:
    1 ±
    Цитата Сообщение от Pro_Coder Посмотреть сообщение
    Вы не думали, почему бы не сделать двумерный массив для 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
    Покажи строки на которые указывают ошибки

  2. #182
    Аватар для Pro_Coder
    Пользователь

    Статус
    Оффлайн
    Регистрация
    11.10.2020
    Сообщений
    59
    Репутация:
    2 ±
    PHP код:
    p_Name[4][MAX_PLAYER_NAME 1
    pawn не поддерживает двумерный массив в enum

  3. #183
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Pro_Coder Посмотреть сообщение
    Вы не думали, почему бы не сделать двумерный массив для 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
    А ты не думал разобраться в том, что из себя на самом деле представляет enum?

    Да и зачем хранить сразу 4 ника? Если это именно разные ники и использоваться при игре будет только один - логично хранить только его в памяти сервера, а остальные оставить в БД. Если же это просто несколько разновидностей одного и того же ника, то пихать их в такой "массив" - самая неудачная идея из всех возможных, ибо сам через пару месяцев будешь с трудом вспоминать какой именно индекс такого массива к какому нику относится. Гораздо лучше под каждый ник выделить свою константу, дав ей нормальное информативное имя, и работать с ней.

    Ну и если всё же очень хочется извращений, то можно сделать так:
    1. enum e_PLAYER_NAMES
    2. {
    3. PLAYER_NAME_1[MAX_PLAYER_NAME],
    4. PLAYER_NAME_2[MAX_PLAYER_NAME],
    5. PLAYER_NAME_3[MAX_PLAYER_NAME],
    6. PLAYER_NAME_4[MAX_PLAYER_NAME],
    7. };
    8.  
    9. enum e_pInfo {
    10. p_ID,
    11. p_Password[64 + 1],
    12. p_Salt[64 + 1],
    13. p_Name[e_PLAYER_NAMES]
    14. };
    15. new pInfo[MAX_PLAYERS][e_pInfo];
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  4. Пользователь сказал cпасибо:
    Pro_Coder (16.10.2020)
  5. #184
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от Pro_Coder Посмотреть сообщение
    Вы не думали, почему бы не сделать двумерный массив для enum ?
    Вы даже не представляете, сколько раз этот вопрос задавали разработчикам компилятора...

    Ответ на самом деле предельно простой: enum - это не аналог struct из C/C++, это просто enum с расширенным синтаксисом в сравнение с теми же C и C++.
    Например, такой код:
    1. enum pInfo
    2. {
    3. pPassHash[64 + 1],
    4. pLevel
    5. };

    - это всего лишь синтаксический сахар для
    1. enum pInfo
    2. {
    3. pPassHash,
    4. pLevel = pPassHash + pInfo:(64 + 1)
    5. };

    Единственная разница лишь в том, что для первого варианта "sizeof(player_info[pPassHash])" вернёт 65, а для 2-го - 1. Насколько знаю, это единственный случай, когда sizeof возвращает "размер" для чего-то, что на самом деле не является массивом.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  6. Пользователь сказал cпасибо:
    Pro_Coder (16.10.2020)
  7. #185
    Аватар для Pro_Coder
    Пользователь

    Статус
    Оффлайн
    Регистрация
    11.10.2020
    Сообщений
    59
    Репутация:
    2 ±
    У меня тут вопрос возник

    PHP код:
    new test_1[MAX_PLAYERS char] = {3, ...}; 
    Почему такой метод не работает, если {3, ...} должно заполнять все ячейки?
    Или у вашего компилятора такой баг исправлен?

  8. #186
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Pro_Coder Посмотреть сообщение
    У меня тут вопрос возник

    PHP код:
    new test_1[MAX_PLAYERS char] = {3, ...}; 
    Почему такой метод не работает, если {3, ...} должно заполнять все ячейки?
    Или у вашего компилятора такой баг исправлен?
    Почему же не работает?
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  9. #187
    Аватар для Pro_Coder
    Пользователь

    Статус
    Оффлайн
    Регистрация
    11.10.2020
    Сообщений
    59
    Репутация:
    2 ±
    А в чем тогда отличие от фигурных скобках ?
    PHP код:
    test_1{0
    https://ibb.co/8r2Tp6J

    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.

  10. #188
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    А, извиняюсь. Ты же с битами хочешь работать. Тупанул.

    Лучше пусть тебе Daniel_Cortez ответит, чтоб я чего-нибудь лишнего не сморозил.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  11. Пользователь сказал cпасибо:
    Pro_Coder (23.10.2020)
  12. #189
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от Pro_Coder Посмотреть сообщение
    А в чем тогда отличие от фигурных скобках ?
    В том, что с фигурными скобками производится доступ не к ячейкам, а к отдельным байтам массива.
    Если нужно определённым значением инициализировать не ячейки, а все байты массива, то в Pawn это напрямую не сделать. Разве что можно попробовать изловчиться с чем-то вроде такого:
    1. new test[MAX_PLAYERS char] = { 0x03030303, ... }; // 0x03030303 = (3 << 24) | (3 << 16) | (3 << 8) | 3

    , либо вручную проинициализировать циклом.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  13. Пользователь сказал cпасибо:
    Pro_Coder (24.10.2020)
  14. #190
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    "Неофициальный" релиз 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")
        Срабатывает, когда инкремент перечисления со знаком "<<=" или "*=" не имеет эффекта над элементом перечисления, равным нулю.
        Обычно это является признаком ошибки, когда пользователь забыл указать значение для самого первого элемента перечисления.
        1. // Допустим, разные достижения игрока хранятся в виде битовых флагов.
        2. enum ePlayerFlags (<<= 1)
        3. {
        4. // Пользователь забыл указать значение для pfEmailConfirmed, из-за чего элемент
        5. // перечисления оказался равен нулю. Инкремент будет бесполезен, т.к. (0 << 1) = 0.
        6. pfEmailConfirmed, // 0
        7. pfTutorialCompleted, // warning 245: enum increment "<<= 1" has no effect on zero value (symbol "pfEmailConfirmed")
        8. };

      • warning 246: multiplication overflow in enum element declaration (symbol "%s")
        Срабатывает, когда для перечисления указан инкремент со знаком "*=" и при объявлении очередного элемента перечисления из-за умножения происходит целочисленное переполнение.
        1. enum (*= 1024)
        2. {
        3. eField1 = 1,
        4. eField2, // 1024
        5. eField3, // 1048576
        6. eField4, // 1073741824
        7. eField5 // warning 246: multiplication overflow in enum item declaration (symbol "eField5")
        8. };

      • 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:"), а также в некоторых случаях предлагает использовать правильный оператор, если есть возможность его угадать.
        Пример:
        1. new bool:success = Func();
        2. if (~success) // warning 247: use of operator "~" on a "bool:" value; did you mean to use operator "!"?

        В данном примере допущена опечатка: скорее всего, автор хотел использовать на значении с тегом "bool:" логическое отрицание (знак "!") вместо битовой инверсии ("~").
          Открыть/закрыть
        Суть ошибки в том, что любые ненулевые значения интерпретируются как true, из-за чего битовая инверсия логического значения всегда даёт положительный результат.
        Константа Числовое представление Битовая инверсия ("~") Интерпретируется как
        false 0x00000000 0xFFFFFFFF true
        true 0x00000001 0xFFFFFFFE true
        Именно поэтому битовая инверсия логического значения обычно является признаком ошибки, на что и указывает новая диагностика.

      • warning 248: possible misuse of comma operator
        Срабатывает, когда пользователь объединяет два выражения в одно с помощью знака ",", однако выражение перед запятой не имеет побочного эффекта (например, просто считывает значение из переменной), что может являться признаком ошибки.
        1. // Опечатка: пользователь явно хотел использовать другой знак вместо ","
        2. // (скорее всего, это знак "<", т.к. он располагается на одной клавише с ",")
        3. if (x , y) { /* ... */ } // warning 248: possible misuse of comma operator

        Данная диагностика работает только внутри контрольных выражений в if и switch, а также в условиях циклов.

    • Исправлен баг, из-за которого компилятор не генерировал код для части выражения, если оно состоит из нескольких подвыражений, перечисляемых с помощью знака "," и последнее подвыражение имеет константный результат.
      1. return (SendClientMessage(playerid, -1, "OK"), 1);
      2. // Функция SendClientMessage() не вызывалась, т.к. компилятор не генерировал код
      3. // для всего, что было перед константной частью выражения (", 1")


    • Убраны лишние сообщения warning 242 для ситуаций, когда для перечисления уже выдано сообщение warning 241.
      1. enum (<<= 32) // warning 241: negative or too big shift count
      2. {
      3. eItem1 = 1,
      4. eItem2, // warning 242: shift overflow in enum item declaration (symbol "eItem2")
      5. eItem3 // warning 242: shift overflow in enum item declaration (symbol "eItem3")
      6. // Предупреждения о переполнении при сдвиге (warning 242) по сути верны, но
      7. // в данной ситуации они только лишний раз отвлекают пользователя, т.к.
      8. // компилятор уже предупредил о неправильном значении сдвига (warning 241).
      9. };

    • Исправлено отсутствие предупреждения, когда для аргумента-массива значение по умолчанию отличалось между объявлением и реализацией (или между двумя разными объявлениями).
      1. forward Func(const a[] = { 1, 2, 3 });
      2. stock Func(const a[] = { 3, 4, 5 }) // error 025: function heading differs from prototype
      3. return a[0];

    • Теперь компилятор выдаёт ошибку, когда #pragma warning push используется больше раз, чем #pragma warning pop (когда пользователь использует "push", но забывает восстановить прежнее состояние варнингов с помощью "pop"), и наоборот (т.е. использует "pop", забыв до этого использовать "push").
      1. #pragma warning disable 238
      2. #pragma warning push
      3. main(){}
      4. // error 001: expected token: "#pragma warning pop", but found "-end of file-"

      1. #pragma warning pop // error 026: no matching "#pragma warning push"
      2. main(){}

    • Исправлены некорректные сообщения об ошибках, выдаваемые, когда вместо массива пользователь пытался получить элемент из одиночной переменной, либо когда переменной/массива с указанным названием не существовало.
      1. main() {
      2. return arr[0]; // массив с именем "arr" не объявлен
      3. }

      До исправления:
      Код:
      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
      Правильным здесь является только первое сообщение (о неправильном идентификаторе, из которого пытаются получить элемент массива); остальные некорректны и являются результатом того, что наткнувшись на неподходящий/необъявленный идентификатор, компилятор не пытается обработать индексную часть ("[0]" в примере выше), а вместо этого сразу ожидает окончание выражения (символ ";").
      После исправления компилятор выдаёт только одно корректное сообщение и не прерывает компиляцию из-за фатальной ошибки, продолжая анализировать код дальше.
    • Исправлены некорректные сообщения об ошибках, выдаваемые, когда пользователь пытался объявить локальную переменную с помощью ключевого слова stock (локальные переменные можно объявлять только с помощью спецификаторов new и static).
      1. main() {
      2. stock x = 0;
      3. return x;
      4. }

      До исправления:
      Код:
      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"
      После исправления компилятор выдаёт более понятное сообщение о неправильном объявлении:
      Код:
      test.pwn(2) : error 010: invalid function or declaration
      , после чего не отвлекает пользователя лишними сообщениями из-за необъявленной переменной "x" (т.е. объявление обрабатывается корректно, как если бы оно было сделано с помощью ключевого слова new или static).
    • Исправлено ложное срабатывание 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).

  15. 6 пользователя(ей) сказали cпасибо:
    20th century (02.01.2021) DeimoS (14.01.2021) nekaz (02.01.2021) Osetin (03.01.2021) Pro_Coder (02.01.2021) punkochel (02.01.2021)
 

 
Страница 19 из 22 ПерваяПервая ... 9 17 18 19 20 21 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Метки этой темы

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •