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

    Статус
    Оффлайн
    Регистрация
    05.10.2019
    Адрес
    Планета Земля
    Сообщений
    318
    Репутация:
    7 ±

    Глобальный массив, который постоянно перезаписывается

    Видел в коде использование глобального массива totalstring, и понял принцип - под него выделяется место в стеке (только под него), и он перезаписывается, вместо создания локальных массивов, занимающие дополнительное место в стеке (причем они даже не обнуляются)

    А вдруг она не может одновременно перезаписываться сразу в нескольких местах, что вызовет баги? Например она будет перезаписываться для одной системы, но т.к. она уже там используется, не сработает в другой? Думаю вы поняли. Надежно ли такое использование? Для теста на практике нужно вызвать несколько команд с перезаписью такого глобального массива в одно мгновенье, но сомневаюсь, что такое возможно сделать даже со своим другом на локалке, поэтому хотелось бы теоретической части.
    Последний раз редактировалось SteveStage; 22.11.2019 в 19:45.

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

    Статус
    Оффлайн
    Регистрация
    14.09.2019
    Сообщений
    2
    Репутация:
    0 ±
    Обычно, если ты хочешь использовать глобальный массив - ты должен постоянно создавать новый, если будешь использовать его совершенно в другой системе, иначе, как ты и сказал, будут ошибки.

  3. #3
    Аватар для execution
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.03.2018
    Сообщений
    255
    Репутация:
    24 ±
    Код выполняется синхронно, тоесть не начнётся одно дейсвтие, пока не закончится предыдущее.

    Поправьте, если не прав.
    Когда ты создаёшь глобальную переменную, то под неё выделяется место в физической памяти. Когда создаёшь локальную - стэковая память.
    Многие используют глобальный массив, чтобы не забивать стэковую память, что лучше всего не делать.
    Последний раз редактировалось execution; 23.11.2019 в 09:28. Причина: подправил

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

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

    Ну а касаемо вопроса ответили ранее - сервер работает в одном потоке и не может, например, обрабатывать код одной и той же команды для двух разных игроков. Сначала сработает код команды для одного игрока, а после сработает для другого. Так что если речь об массиве, который просто хранит временную информацию (например, текст при форматировании), то ничего плохого не случится (но так делать не стоит, ибо для такого есть стек). А если тебе нужно хранить какую-то информацию для каждого игрока отдельно и иметь к ней доступ даже после того, как закончится обработка определённого коллбэка, то тут нужно создавать двумерный массив, одной мерой из которого будет указываться ID игрока.


    Цитата Сообщение от execution Посмотреть сообщение
    Код выполняется асинхронно, тоесть не начнётся одно дейсвтие, пока не закончится предыдущее.

    Поправьте, если не прав.
    Когда ты создаёшь глобальную переменную, то под неё выделяется место в физической памяти. Когда создаёшь локальную - стэковая память.
    Многие используют глобальный массив, чтобы не забивать стэковую память, что лучше всего не делать.
    Сформулировал правильно, но перепутал "асинхронно" с "синхронно")
    Последний раз редактировалось DeimoS; 23.11.2019 в 08:40.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

  5. 2 пользователя(ей) сказали cпасибо:
    execution (23.11.2019) SteveStage (23.11.2019)
  6. #5
    Аватар для SteveStage
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.10.2019
    Адрес
    Планета Земля
    Сообщений
    318
    Репутация:
    7 ±
    Как я понял, память и стек работают вот так (с массивами тоже самое): https://ibb.co/gJfVcdg

    И стек постоянно очищается (становится доступным) для нового участка кода
    Последний раз редактировалось SteveStage; 23.11.2019 в 17:04.

  7. #6
    Аватар для DeimoS
    Модератор?

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

    Ну и если вдаваться в подробности, то правильнее будет так:




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

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

    Steve Pavlina

  8. #7
    Аватар для SteveStage
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.10.2019
    Адрес
    Планета Земля
    Сообщений
    318
    Репутация:
    7 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Ну и если вдаваться в подробности, то правильнее будет так:




    Верно, но мы сейчас говорим про переменные/массивы, а куча не связана с ними (не хранит их), вроде как хранит вычисления (вычитал из инета:) и начинается с конца

    Цитата Сообщение от DeimoS Посмотреть сообщение
    Стек отчищается не постоянно, а в момент, когда закончился обрабатываться определённый блок кода. В теме, на которую давал ссылку, есть же пример. И, в целом, принцип работы стека/кучи в Pawn довольно схож с другими ЯП. Разве что вариантов взаимодействия с ними меньше и часть логики прописана изначально.
    Я же это и имел ввиду, но блоки кода выполняются не 30 минут, а пару секунд => во время работы сервера стек постоянно очищается от предыдущего блока кода и переходит к следующему блоку кода.

    И еще, хотел бы узнать, как можно увеличить стек (вдруг пригодится)? Лучше быть готовым и не пригодится, чем не быть готовым и пригодится
    Последний раз редактировалось DeimoS; 23.11.2019 в 18:42.

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Так я же и говорю: если вдаваться в подробности.
    Изменять количество памяти, которая будет выделена под стек/кучу, можно так
    1. #pragma dynamic количество_ячеек
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

  10. Пользователь сказал cпасибо:
    SteveStage (23.11.2019)
  11. #9
    Аватар для DeimoS
    Модератор?

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

    UPD: я, похоже, вместо объединения сообщений случайно их удалил =\ Извиняюсь. Не стоило модерировать в 5 часов ночи)...
    Последний раз редактировалось DeimoS; 24.11.2019 в 03:07.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    05.10.2019
    Адрес
    Планета Земля
    Сообщений
    318
    Репутация:
    7 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Стек и куча - это один сегмент данных. То бишь, те 16384 байта, которые выделяются по стандарту - это и стек, и куча. Просто данные стека записываются с начала, а данные кучи - с конца.
    Окей, т.е. если стек заполнен на 8 кб, и куча на 8 кб - будет переполнение?

    Цитата Сообщение от DeimoS Посмотреть сообщение
    UPD: я, похоже, вместо объединения сообщений случайно их удалил =\ Извиняюсь. Не стоило модерировать в 5 часов ночи)...
    Я отправил:

    1) 1 ячейка = 4 байта. Стандартный размер стека 4096 ячеек, или 16384 байта

    2) То, что ты процитировал
    Последний раз редактировалось SteveStage; 25.11.2019 в 01:35.

 

 
Страница 1 из 2 1 2 ПоследняяПоследняя

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

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

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

Ваши права

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