Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 3 из 3 ПерваяПервая 1 2 3
Показано с 21 по 29 из 29
  1. #21
    Аватар для vovandolg
    Пользователь

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,369
    Репутация:
    113 ±
    Цитата Сообщение от Geebrox Посмотреть сообщение
    Я имел ввиду СТРОК, у меня не чистился, но уже получил ответ от ziggi
    У тебя наверняка где то запись повторная шла в массив после очистки
    (так как я в логи выводил и массивы пустые были после такой очистки)
    [Anticheat]___Invisible Fly Hack
    [Anticheat]____Weapon/Ammo Hack
    [Function]______ResetPlayerWeaponSlot
    [Function]_______FIX_SetPlayerAmmo
    [ServerMod]______TDM | Zombie Apokalypse

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

    Статус
    Оффлайн
    Регистрация
    24.08.2015
    Адрес
    Ташкент
    Сообщений
    375
    Репутация:
    97 ±
    Цитата Сообщение от vovandolg Посмотреть сообщение
    У тебя наверняка где то запись повторная шла в массив после очистки
    (так как я в логи выводил и массивы пустые были после такой очистки)
    может быть, я сейчас заново протестил, строка очистился
    Респект:
    @DeimoS
    @ziggi
    @Daniel_Cortez

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

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

    Действительно, отчищаться будет.
    Если кто-то не понимает почему, то тут всё просто. Отчищается он из-за того, что мы объявляем второй массив с тем же числом ячеек, при этом не заполнив его никакими значениями (следовательно, он заполнится нулями), а после приравниваем первый массив ко второму, из-за чего первый "перенимает" все значения второго (использование оператора "=" прокатит только в том случае, когда массивы либо одинаковые по размеру, либо второй массив меньше). Так как второй массив заполнен нулями, первый так же "обнулится".

    Вот простой пример с локальным массивом
    PHP код:
    new string[] = "Pro-Pawn";
    static const 
    NULL_string[sizeof(string)];
    print(string);
    string NULL_string;
    print(string);
    print(
    string[3]); 
    Я бы и
    PHP код:
    new NULL_PlayerInfo[pInfo] = {"noname"50.0100}; 
    предложил оформить как константу, дабы "случайно" не изменить в нём какие-либо данные
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

  4. Пользователь сказал cпасибо:
    Geebrox (22.10.2016)
  5. #24
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Заметил, что способ с NULL_ может вызывать проблемы, связанные с перезаписью лишних ячеек памяти.

    Имелась такая структура массивов:
    PHP код:
    enum PlayerInterfaceParams {
        
    PIP_TextDraw,
        
    PIP_Visible,
    }

    enum PlayerInterface {
        
    PI_Armour,
        
    PI_Health,
        
    PI_Info,
        
    PI_LevelLineBackground,
        
    PI_LevelLine,
        
    PI_LevelLevel,
        
    PI_LevelPlus,
        
    PI_LevelXP,
        
    PI_LevelXPPlus,
        
    PI_MoneyBorder,
        
    PI_MoneyBackground,
        
    PI_MoneyMoney,
        
    PI_MoneyPlus,
        
    PI_WeaponSkill,
    }

    new
        
    gPlayerInterface[MAX_PLAYERS][PlayerInterface][PlayerInterfaceParams],
        
    NULL_gPlayerInterface[PlayerInterface][PlayerInterfaceParams]; 
    Использовал я так:
    PHP код:
    public OnPlayerConnect(playerid)
    {
        
    gPlayerInterface[playerid] = NULL_gPlayerInterface;
        
    TogglePlayerInterfaceVisibility(playeridtruetrue);
        return 
    1;

    И с таким кодом происходили разного рода проблемы, значения менялись и у другого игрока, например.

    А с этим кодом всё работает нормально:
    PHP код:
    public OnPlayerConnect(playerid)
    {
        for (new 
    0sizeof(gPlayerInterface[]); i++) {
            for (new 
    0sizeof(gPlayerInterface[][]); j++) {
                
    gPlayerInterface[playerid][PlayerInterface:i][PlayerInterfaceParams:j] = 0;
            }
        }
        
    TogglePlayerInterfaceVisibility(playeridtruetrue);
        return 
    1;

    Так что вариант с NULL_ небезопасный, лучше его не использовать.

  6. 2 пользователя(ей) сказали cпасибо:
    Daniel_Cortez (23.11.2018) Smalin (24.11.2018)
  7. #25
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Похоже на баг компилятора. Я взял код из поста выше, закомментировал все поля в PlayerInterface кроме одного PI_Armour (чтобы было проще смотреть на отладочный вывод) и добавил код для инициализации ячеек массива gPlayerInterface и отладочного вывода значений из него.
      Открыть/закрыть

    1. enum PlayerInterfaceParams
    2. {
    3. PIP_TextDraw,
    4. PIP_Visible,
    5. };
    6. enum PlayerInterface
    7. {
    8. PI_Armour,
    9. /*
    10.   PI_Health,
    11.   PI_Info,
    12.   PI_LevelLineBackground,
    13.   PI_LevelLine,
    14.   PI_LevelLevel,
    15.   PI_LevelPlus,
    16.   PI_LevelXP,
    17.   PI_LevelXPPlus,
    18.   PI_MoneyBorder,
    19.   PI_MoneyBackground,
    20.   PI_MoneyMoney,
    21.   PI_MoneyPlus,
    22.   PI_WeaponSkill,
    23.   */
    24. };
    25. new gPlayerInterface[MAX_PLAYERS][PlayerInterface][PlayerInterfaceParams];
    26. new NULL_gPlayerInterface[PlayerInterface][PlayerInterfaceParams];
    27.  
    28. InitPlayerInterface(playerid, value)
    29. {
    30. for (new i = 0; i < _:PlayerInterface; ++i)
    31. for (new j = 0; j < _:PlayerInterfaceParams; ++j)
    32. gPlayerInterface[playerid][PlayerInterface:i][PlayerInterfaceParams:j] = value;
    33. }
    34.  
    35. DebugPrintPlayerInterface(playerid)
    36. {
    37. for (new i = 0; i < _:PlayerInterface; ++i)
    38. for (new j = 0; j < _:PlayerInterfaceParams; ++j)
    39. "\tgPlayerInterface[%d][%d][%d]: 0x%08x",playerid, i, j,
    40. gPlayerInterface[playerid][PlayerInterface:i][PlayerInterfaceParams:j]);
    41. }
    42.  
    43. main()
    44. {
    45. InitPlayerInterface(0, 0xCCCCCCCC);
    46. InitPlayerInterface(1, 0xDDDDDDDD);
    47. InitPlayerInterface(2, 0xEEEEEEEE);
    48. InitPlayerInterface(3, 0xFFFFFFFF);
    49. printf("Before:");
    50. for (new i = 0; i < 4; ++i)
    51. DebugPrintPlayerInterface(i);
    52. new playerid = 0;
    53. gPlayerInterface[playerid] = NULL_gPlayerInterface;
    54. printf("After:");
    55. for (new i = 0; i < 4; ++i)
    56. DebugPrintPlayerInterface(i);
    57. }


    Вывод:
      Открыть/закрыть

    Код:
    Before:
            gPlayerInterface[0][0][0]: 0xCCCCCCCC
            gPlayerInterface[0][0][1]: 0xCCCCCCCC
            gPlayerInterface[1][0][0]: 0xDDDDDDDD
            gPlayerInterface[1][0][1]: 0xDDDDDDDD
            gPlayerInterface[2][0][0]: 0xEEEEEEEE
            gPlayerInterface[2][0][1]: 0xEEEEEEEE
            gPlayerInterface[3][0][0]: 0xFFFFFFFF
            gPlayerInterface[3][0][1]: 0xFFFFFFFF
    After:
            gPlayerInterface[0][0][0]: 0x00000000
            gPlayerInterface[0][0][1]: 0x00000000
            gPlayerInterface[1][0][0]: 0x00000000
            gPlayerInterface[1][0][1]: 0x00000000
            gPlayerInterface[2][0][0]: 0x00000000
            gPlayerInterface[2][0][1]: 0x00000FAC
            gPlayerInterface[3][0][0]: 0xFFFFFFFF
            gPlayerInterface[3][0][1]: 0xFFFFFFFF

    Как и было сказано, обнуляются ячейки не только для playerid, но и для следующих двух игроков. Что интересно, в gPlayerInterface[2][0][1] вместо 0 было записано значение 0x00000FAC - скорее всего, оно попало туда по ошибке из таблицы смещений от массива gPlayerInterface.

    @ziggi, я сообщу об этом баге в репо компилятора, или ты сам?
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  8. #26
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    @ziggi, я сообщу об этом баге в репо компилятора, или ты сам?
    Сообщи, у тебя лучше получится объяснить)

  9. #27
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от ziggi Посмотреть сообщение
    Сообщи, у тебя лучше получится объяснить)
    Ок, https://github.com/pawn-lang/compiler/issues/388

    Забыл сказать, проблема весьма специфическая и проявляется только когда в обоих массивах (т.е. и в массиве-источнике, и в приёмнике) есть 2 и более enum-измерения. Иными словами, если убрать у массивов последнее измерение
    1. new gPlayerInterface[MAX_PLAYERS][PlayerInterface];
    2. new const NULL_gPlayerInterface[PlayerInterface];

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

  10. #28
    Аватар для bullplex
    Пользователь

    Статус
    Оффлайн
    Регистрация
    20.05.2018
    Сообщений
    7
    Репутация:
    0 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Ок, https://github.com/pawn-lang/compiler/issues/388

    Забыл сказать, проблема весьма специфическая и проявляется только когда в обоих массивах (т.е. и в массиве-источнике, и в приёмнике) есть 2 и более enum-измерения. Иными словами, если убрать у массивов последнее измерение
    1. new gPlayerInterface[MAX_PLAYERS][PlayerInterface];
    2. new const NULL_gPlayerInterface[PlayerInterface];

    копирование будет происходить правильно, без перезаписи лишних ячеек.
    При const невозможно использование (вылетают ошибки 017 и 033). Пример:
    1. gPlayerInterface[playerid] = NULL_gPlayerInterface;

  11. #29
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от bullplex Посмотреть сообщение
    При const невозможно использование (вылетают ошибки 017 и 033). Пример:
    1. gPlayerInterface[playerid] = NULL_gPlayerInterface;
    Ищите причину в своём коде, чистый скрипт компилируется без проблем.
      Открыть/закрыть
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

 

 
Страница 3 из 3 ПерваяПервая 1 2 3

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

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

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

Ваши права

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