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

    Статус
    Оффлайн
    Регистрация
    31.03.2016
    Сообщений
    257
    Репутация:
    3 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Про подсчёт можно почитать тут.
    А стеков не может быть 13. Ты не так понял, видимо :) Стэк один. Это локальная память.
    Если ты говоришь про 13 массивов, то да, это многовато для 13 массивов
    Ну, видимо, да, не так понял 13 stock'ов, несколько форвардов и две команды, которые используют формат (сток, стэк, не знаю, как правильно), ну а так вот нормальны ли показатели при компилировании, которые я написал выше?
    Последний раз редактировалось PawnoNoob; 03.04.2016 в 22:58.

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от PawnoNoob Посмотреть сообщение
    Ну, видимо, да, не так понял 13 stock'ов, несколько форвардов и две команды, которые используют формат (сток, стэк, не знаю, как правильно), ну а так вот нормальны ли показатели при компилировании, которые я написал выше?
    Сток - это оператор и пишется он так - "stock"
    Стэк - это сегмент данных и пишется он так "stack"

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

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

    Steve Pavlina

  3. Пользователь сказал cпасибо:
    PawnoNoob (03.04.2016)
  4. #13
    Аватар для PawnoNoob
    Пользователь

    Статус
    Оффлайн
    Регистрация
    31.03.2016
    Сообщений
    257
    Репутация:
    3 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Сток - это оператор и пишется он так - "stock"
    Стэк - это сегмент данных и пишется он так "stack"

    Нужно смотреть сам код. Ну если действительно так мало массивов создано, то не особо нормально
    Последний вопрос, который я хотел бы задать: вот у меня есть система чата, как на RP сервере, под него я выделил 128 символов. В самом же чате я могу написать очень-очень много символов до такой степени, что они дойдут до HUD (до денег или иконки оружия), при этом заходя за границу экрана. Как это можно поправить? Установить какое-нибудь ограничение? Через "if(strlen(inputtext)"? Или это только для диалоговых окон?

  5. #14
    Аватар для Prolific
    Пользователь

    Статус
    Оффлайн
    Регистрация
    24.12.2013
    Сообщений
    116
    Репутация:
    14 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Да, скажется. Переполнением стэка, например, и кучей всевозможных багов и крашей из-за этого. Выделяй ровно столько ячеек, сколько требуется
    Ой ну не приувеличивай. РЛС с этим не заморачивался и работал. Так сказал как буд-то планета с орбиты сойдет из-за этого.

    - - - Добавлено - - -

    Цитата Сообщение от PawnoNoob Посмотреть сообщение
    Последний вопрос, который я хотел бы задать: вот у меня есть система чата, как на RP сервере, под него я выделил 128 символов. В самом же чате я могу написать очень-очень много символов до такой степени, что они дойдут до HUD (до денег или иконки оружия), при этом заходя за границу экрана. Как это можно поправить? Установить какое-нибудь ограничение? Через "if(strlen(inputtext)"? Или это только для диалоговых окон?
    https://wiki.sa-mp.com/wiki/SendClientMessage
    const message[] The text that will be displayed (max 144 characters).

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

    Статус
    Оффлайн
    Регистрация
    31.03.2016
    Сообщений
    257
    Репутация:
    3 ±
    Цитата Сообщение от Prolific Посмотреть сообщение
    Ой ну не приувеличивай. РЛС с этим не заморачивался и работал. Так сказал как буд-то планета с орбиты сойдет из-за этого.

    - - - Добавлено - - -



    https://wiki.sa-mp.com/wiki/SendClientMessage
    const message[] The text that will be displayed (max 144 characters).
    А как можно поставить ограничение на количество символов в чате? Чтобы не выходило за границы монитора.

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

    Статус
    Оффлайн
    Регистрация
    24.12.2013
    Сообщений
    116
    Репутация:
    14 ±
    Цитата Сообщение от PawnoNoob Посмотреть сообщение
    А как можно поставить ограничение на количество символов в чате? Чтобы не выходило за границы монитора.
    Насколько я знаю оно и не доходит до конца монитора, хотя наверное при разных разрешениях экрана по разному.
    Используй strlen,
    PHP код:
    if(strlen(inputtext) > 144
        
    strdel(inputtext144strlen(inputtext)); 

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

    Статус
    Оффлайн
    Регистрация
    31.03.2016
    Сообщений
    257
    Репутация:
    3 ±
    Хм-м-м, ну, я даже и не знаю, что здесь можно сказать
    Скриншот:

    Кусочек кода из OnPlayerText:
    PHP код:
    new string[128];
    format(stringsizeof(string), "%s[%d]: %s"textполучение никнеймаplayerid);
    SendClientMessage(playerid20.0цветstring); 

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

    Статус
    Оффлайн
    Регистрация
    24.12.2013
    Сообщений
    116
    Репутация:
    14 ±
    (playerid, 20.0, цвет, string);
    Не много ли параметров?
    Показывай перехват SendClientMessage.

  11. #19
    Аватар для PawnoNoob
    Пользователь

    Статус
    Оффлайн
    Регистрация
    31.03.2016
    Сообщений
    257
    Репутация:
    3 ±
    Цитата Сообщение от Prolific Посмотреть сообщение
    (playerid, 20.0, цвет, string);
    Не много ли параметров?
    Показывай перехват SendClientMessage.
    Упс, там не SendClientMessage, а вызывается сток, который отвечает за сообщение на расстоянии (ProxDetector) Это просто я только что сам написал, а не скопировал из своего кода.

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Prolific Посмотреть сообщение
    Ой ну не приувеличивай. РЛС с этим не заморачивался и работал. Так сказал как буд-то планета с орбиты сойдет из-за этого.
    Там было сравнительно небольшое переполнение стэка, которое компенсировалось тем, что коллбэк, отжирающий такое большое кол-во стэка, не выполнялся весь сразу, а в нём выполнялись лишь определённые условия и то самое переполнение стэка просто не успевало происходить. Вот тебе простой пример настоящего переполнения стэка.
    PHP код:
    #pragma dynamic 80
    main()
    {
        new 
    string[100];
        
    format(stringsizeof(string), "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd");
        print(string);
        print(
    "Ура, я сработал!");

    Есть два исхода ситуации для обработки этого кода: с Jit-плагина и без Jit-плагина. Но начать я бы хотел с краткого объяснения того, как работает стэк.

    А понять надо именно то, что в стэк данные записываются не обычным образом: от начала к концу (1, 2, 3, 4, 5...), а каждый новый элемент попадает в начало (...5, 4, 3, 2, 1). Проще всего стэк представить как стопку тарелок. Ты не можешь взять тарелку из середины стопки, и засунуть тарелку в середину тоже не можешь. Ты можешь работать только с вершиной стопки. Так же и в стэке. Ему просто не нужно структурировать себя иначе, ибо вся информация попадает в него непрерывным потоком и выдаётся она так же непрерывным потоком (напомню, что стэк, по сути своей, похож на оперативную память, в которую данные загрузились, обработались и тут же выгрузились).
    Ну а теперь вернёмся к исходам.

    • Исход №1: (сразу предупреждаю, с Jit-компиляцией я знаком поверхностно и всё, что я напишу ниже - лишь мои предположения того, почему ошибок о переполнении стэка не появляется)
      Особенность Jit-плагина в том, что он не работает с скомпилированным кодом напрямую, а, фактически, компилирует его прямо на ходу. Из-за этого получается так, что все инструкции для работы серверной машины формируются прямо на месте обработки кода => и инструкции по заносу данных в стэк так же формируются на ходу => из-за этого данные, в случае переполнения, просто перезапишут друг друга и если это не приведёт к каким-то серьёзным последствиям (не перезапишется какая-то важная информация или же переполнение будет очень уж большим) - код обработается, но результатом работы будет порча данных.

      В нашем случае, если выделить больше ~ 85 ячеек под стэк - оба сообщения отобразятся нормально, а пострадает лишь информация о вызываемых функциях (при обработке в стэк сначала запишется информация о массиве, после запишется информация о вызове format, а после уже информация о print. Но вспомним про стопкообразную структуру стэка и тут следует понять, что информация print просто займёт место о данных о format... Дальше, возможно, будет понятнее :) )
      Если же выделить меньше 85 ячеек, "буфера" из информации о вызываемых функциям (а это имя самой функции + информация о параметрах) уже не хватит и строка из print с сообщением "Ура, я сработал!" начнёт "заезжать" на строку из массива, которую мы отобразили ранее и которая в стеке будет находится сразу за строкой "Ура, я сработал!". Следовательно, нуль-символ строки "Ура, я сработал!" будет перезаписан на один из других символов и строки будут отображены вместе, ибо ближайший нуль-символ будет только в массиве. И чем меньше вы выделите памяти под стэк, тем больше строка "Ура, я сработал!" начнёт "съедать" той информации, что была записана ранее. И в консоль начнут отображаться различные лишние символы. Так будет до тех пор, пока вы не уменьшите стэк до тех пор, когда даже для строки "Ура, я сработал!" не хватит места. Тогда даже с Jit -плагином случится ошибка, которая сообщит о переполнении стэка

    • Исход №2:
      Без Jit-плагина даже переполнение на 1 ячейку вызовет ошибку у сервера при обработке кода и весь последующий код (в нашем случае это строка "Ура, я сработал!"), что находился в коллбэке/функции после злополучной строки с переполнением, обработан не будет. А теперь представь, что у тебя таких переполнений несколько по всему моду и они находятся в разных коллбэках/функциях и вызываются разными условиями. И тут, когда у тебя на сервере большой онлайн и, соответственно, частота вызова разных участков кода возрастает, вероятность вызова "больного" кода так же возрастает и начинаются различные проблемы, когда у тебя то одна система начинает работать не правильно (стэк переполнился и код перестал обрабатываться => каким-то переменным не присвоились нужные значения, какие-то функции не вызвались и т.п.), то другая. И ты не можешь понять что происходит, ведь, вроде бы, код весь нормально построен и все условия срабатывают...


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

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

    Steve Pavlina

  13. Пользователь сказал cпасибо:
    PawnoNoob (04.04.2016)
 

 
Страница 2 из 9 ПерваяПервая 1 2 3 4 ... ПоследняяПоследняя

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

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

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

Ваши права

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