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

    Статус
    Оффлайн
    Регистрация
    24.03.2015
    Сообщений
    32
    Репутация:
    0 ±

    Чем грозит возврат массива?

    PHP код:
    format(str,sizeof(str),"%s %s удалил админ данные ''%s''",AdminRang(playerid),sendername(playerid),inputtext);
    stock AdminRang(playerid)
    {
        new 
    text[24];
        switch(
    Player[playerid][pAdmin])
        {
        case 
    1text "Помощник";
        case 
    2text "Ст.Помощник";
        case 
    3text "Мл.Администратор";
        case 
    4text "Администратор";
        case 
    5text "Ст.Администратор";
        case 
    6text "Администратор Фракций";
        case 
    7text "Администратор Банов";
        case 
    8text "Администратор Ивентов";
        case 
    9text "Зам.Гл.Админинистратора";
        case 
    10text "Гл.Администратор";
        case 
    11text "Разработчик";
        }
        return 
    text;

    Что будет происходит с памятью, объяснить.
    Последний раз редактировалось Igoreshka; 28.03.2019 в 23:34.

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

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

    Если это просто последовательный вызов функции, а-ля:
    PHP код:
    printf("1) %s"AdminRang(playerid));
    printf("2) %s"AdminRang(playerid));
    printf("3) %s"AdminRang(playerid)); 
    То каждый вызов функции будет как-бы создавать локальный массив на 24 ячейки (так как ты возвращаешь массив в 24 ячейки), записывать в него данные, передавать их в printf и отчищать память. То бишь, постоянно будут лишние действия по инициализации/очищению памяти, что не так страшно, но всё же не желательно.

    Страшнее будут последствия, если вызов функций будет внутри какой-то другой функции, а не последовательно:
    PHP код:
    printf("1) %s %s"AdminRang(playerid), AdminRang(playerid)); 
    Тут уже функции будут потреблять не 24 ячейки, а 48, так как нам нужно хранить результат обоих вызовов функции, а не только одного. Если вызовов будет 3 - будет выделено уже 72 ячейки. Ну и так далее.
    В общем, таким образом легко заполнить весь стек и получить его переполнение. Именно поэтому и не советуют заниматься возвратом строк. Достаточно сделать так:

    PHP код:
    stock GetAdminRankName(playeridrank_name[]) 

        switch(
    Player[playerid][pAdmin]) 
        { 
            case 
    1rank_name "Помощник"
            case 
    2rank_name "Ст.Помощник"
            case 
    3rank_name "Мл.Администратор"
            case 
    4rank_name "Администратор"
            case 
    5rank_name "Ст.Администратор"
            case 
    6rank_name "Администратор Фракций"
            case 
    7rank_name "Администратор Банов"
            case 
    8rank_name "Администратор Ивентов"
            case 
    9rank_name "Зам.Гл.Админинистратора"
            case 
    10rank_name "Гл.Администратор"
            case 
    11rank_name "Разработчик"
        } 
        return 
    1

    И использовать функцию так:
    PHP код:
    new rank_name[24];
    GetAdminRankName(playeridrank_name);
    printf("1) %s %s %s"rank_namerank_namerank_name); 
    И всё, этот код в любом случае будет потреблять 24 ячейки.

    P.S. Хотя в твоём случае лучше вынести имена рангов в глобальный массив:
    PHP код:
    new const AdminRankName[][24] =
    {
        
    "Помощник",
        
    "Ст.Помощник",
        
    "Мл.Администратор",
        
    "Администратор",
        
    "Ст.Администратор",
        
    "Администратор Фракций",
        
    "Администратор Банов",
        
    "Администратор Ивентов",
        
    "Зам.Гл.Админинистратора",
        
    "Гл.Администратор",
        
    "Разработчик"
    }; 
    А потом обращаться к нему напрямую, отнимая единицу от текущего уровня админа (так как ячейки в массиве с 0 начинаются, а уровень с 1)
    PHP код:
    format(str,sizeof(str),"%s %s удалил админ данные ''%s''"AdminRankName[Player[playerid][pAdmin]-1], sendername(playerid), inputtext); 
    Только нужно всегда следить, чтоб уровень админки был больше 0 и меньше 12 (1-11), дабы при обращении к массиву не получить выход за его пределы.
    Можно написать макрос для удобства:
    PHP код:
    #define GetAdminRankName(%0) AdminRankName[Player[%0][pAdmin]-1]
    //
    format(str,sizeof(str),"%s %s удалил админ данные ''%s''"GetAdminRankName(playerid), sendername(playerid), inputtext); 
    С глобальным массивом никакой дополнительной памяти для промежуточного хранения текста выделяться не будет.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    24.03.2015
    Сообщений
    32
    Репутация:
    0 ±
    Спасибо. Теперь понял.

 

 

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

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

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

Ваши права

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