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

    Статус
    Оффлайн
    Регистрация
    30.12.2015
    Сообщений
    24
    Репутация:
    2 ±

    Пару вопросиков

    Доброго дня, решился все таки и я задать парочку вопросов по программированию Pawn

    1. В чем разница между этим
    PHP код:
    CMD:ahelp(playerid)
    {
        new 
    level PlayerInfo[playerid][pAdmin];
        if(
    level >= 1SendClientMessage(playeridGREEN"Доступные команды:"), SendClientMessage(playeridYELLOW"1 уровень: ...");
        if(
    level >= 2SendClientMessage(playeridYELLOW"2 уровень: ...");
        
    // и так далее
        
    return true;

    и этим
    PHP код:
    CMD:ahelp(playerid)
    {
        if(
    PlayerInfo[playerid][pAdmin] >= 1SendClientMessage(playeridGREEN"Доступные команды:"), SendClientMessage(playeridYELLOW"1 уровень: ...");
        if(
    PlayerInfo[playerid][pAdmin] >= 2SendClientMessage(playeridYELLOW"2 уровень: ...");
        
    // и так далее
        
    return true;

    (В первом случае вводиться отдельная переменная)
    Влияет ли это как-то на время выполнения кода?

    2. Как можно эффективно экономить размер стэка?
    Вот например если в абсолютно чистый мод вставить этот отрезок кода
    PHP код:
        static const welcome_message[] = "%s, добро пожаловать на сервер!";
        new 
    string[sizeof(welcome_message) - MAX_PLAYER_NAME 1], player_name[MAX_PLAYER_NAME];
        
    GetPlayerName(playeridplayer_namesizeof(player_name));
        
    format(stringsizeof(string), welcome_messageplayer_name);
        
    SendClientMessage(playerid, -1string); 
     Результат компиляции до

     Результат компиляции после

    То размер стэка увеличиться аж на 81 ячейку.Получается еще буквально 50 таких переменных и будет достигнут (!) придел.А в мод еще нужно вместить около сотни (а то и двух) команд, примерно столько же диалогов, и еще прочую тучу различных систем.И как тут быть?

  2. #2
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    1. Нет разницы, если только немного.
    2. Не удивительно, ведь в стек помещается информация: локальные переменные, название функции, возвращаемое значение и т.п. И следует знать, что после выполнения, функция автоматически выгружает заполненную память тем самым восстанавливая стек.

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

    Статус
    Оффлайн
    Регистрация
    30.12.2015
    Сообщений
    24
    Репутация:
    2 ±
    Цитата Сообщение от VVWVV Посмотреть сообщение
    2. Не удивительно, ведь в стек помещается информация: локальные переменные, название функции, возвращаемое значение и т.п. И следует знать, что после выполнения, функция автоматически выгружает заполненную память тем самым восстанавливая стек.
    То бишь не стоит бояться ограничения в 16384 байт?

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от InCorrect Посмотреть сообщение
    1. В чем разница между этим
    PHP код:
    CMD:ahelp(playerid)
    {
        new 
    level PlayerInfo[playerid][pAdmin];
        if(
    level >= 1SendClientMessage(playeridGREEN"Доступные команды:"), SendClientMessage(playeridYELLOW"1 уровень: ...");
        if(
    level >= 2SendClientMessage(playeridYELLOW"2 уровень: ...");
        
    // и так далее
        
    return true;

    и этим
    PHP код:
    CMD:ahelp(playerid)
    {
        if(
    PlayerInfo[playerid][pAdmin] >= 1SendClientMessage(playeridGREEN"Доступные команды:"), SendClientMessage(playeridYELLOW"1 уровень: ...");
        if(
    PlayerInfo[playerid][pAdmin] >= 2SendClientMessage(playeridYELLOW"2 уровень: ...");
        
    // и так далее
        
    return true;

    (В первом случае вводиться отдельная переменная)
    Влияет ли это как-то на время выполнения кода?
    Доступ к одиночным переменным быстрее, чем к ячейкам массива. Если же больше 1 раза производится доступ к ячейке многомерного массива, то лучше заранее кэшировать содержимое этой ячейки в локальной переменной.


    Цитата Сообщение от InCorrect Посмотреть сообщение
    2. Как можно эффективно экономить размер стэка?
    Вот например если в абсолютно чистый мод вставить этот отрезок кода
    PHP код:
        static const welcome_message[] = "%s, добро пожаловать на сервер!";
        new 
    string[sizeof(welcome_message) - MAX_PLAYER_NAME 1], player_name[MAX_PLAYER_NAME];
        
    GetPlayerName(playeridplayer_namesizeof(player_name));
        
    format(stringsizeof(string), welcome_messageplayer_name);
        
    SendClientMessage(playerid, -1string); 
     Результат компиляции до

     Результат компиляции после
    Может всё-таки объясните, что именно было "до", а что "после"? Вы пока что показали только один отрывок кода.

    Цитата Сообщение от InCorrect Посмотреть сообщение
    То размер стэка увеличиться аж на 81 ячейку.Получается еще буквально 50 таких переменных и будет достигнут (!) придел.А в мод еще нужно вместить около сотни (а то и двух) команд, примерно столько же диалогов, и еще прочую тучу различных систем.И как тут быть?
    Ну вы же не собираетесь делать так, чтобы функция вызывала саму себя или другую функцию 50 раз?
    PHP код:
    Function1()
    {
        new array[
    100];
        return 
    Function2();
    }

    Function2()
    {
        new array[
    100];
        return 
    Function3();
    }

    // ...

    Function50()
    {
        new array[
    100];
        return 
    random(0);

    В программировании есть такое понятие, как блок: пространство, в пределах которого существуют локальные переменные.
    PHP код:
    SomeFunction()
    {
        new array[
    80];
        
    // ...

    В примере выше массив array будет существовать только пока выполняется функция. Как только функция завершит своё выполнение, она высвободит место в стеке, занятое под массив array.

    Ещё пример:
    PHP код:
    SomeFunction()
    {
        if(
    IsPlayerConnected(0))
        {
            new array[
    80];
            
    // #1
            // ...
        
    }
        else
        {
            
    // #2
            // ...
        
    }
        
    // #3

    Здесь array существует только внутри блока ветвления if (точка #1). Фукнция зарезервирует место в стеке, как только начнётся выполнение положительной ветки if, и высвободит его по окончании выполнения ветки, поэтому в местах #2 и #3 место в стеке под массив расходоваться не будет.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  6. 3 пользователя(ей) сказали cпасибо:
    Aurelius (12.03.2021) InCorrect (30.12.2015) VVWVV (30.12.2015)
  7. #5
    Аватар для InCorrect
    Пользователь

    Статус
    Оффлайн
    Регистрация
    30.12.2015
    Сообщений
    24
    Репутация:
    2 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Может всё-таки объясните, что именно было "до", а что "после"? Вы пока что показали только один отрывок кода.
    До был чистый мод взятый прямиком с sa-mp.com.

    Еще один вопрос, как в этом коде, правильно подсчитать размер переменной bigstring?
     Код
    PHP код:
    if(strcmp(cmd"/leaders"true) == 0)
        {
            new 
    bigstring[2048], totalLeaders 0;
            
    strcat(bigstring"Организация - Должность - Имя - Телефон\n\n{FFFFFF}");
            for(new 
    0MAX_PLAYERSi++)
            {
                new 
    fractionname[96];
                if(
    Logged[i] == true)
                {
                    if(
    PlayerInfo[i][pAdmin] == && PlayerInfo[i][pLeader] > 0)
                    {
                        
    totalLeaders++;
                        switch(
    PlayerInfo[i][pLeader])
                        {
                            case 
    1fractionname "Grove Street - Daddy";
                            case 
    2fractionname "The Ballas - Big Daddy";
                            case 
    3fractionname "Varios Los Aztecas - Padre";
                            case 
    4fractionname "Los Santos Vagos - Padre";
                            case 
    5fractionname "The Rifa - Padre";
                            case 
    6:
                            {
                                switch(
    PlayerInfo[i][pUnit])
                                {
                                    case 
    0fractionname "Мин. внутренних дел - Министр внутренних дел";
                                    case 
    1fractionname "Управление полиции ЛС - Генерал";
                                    case 
    2fractionname "Управление полиции СФ - Генерал";
                                    case 
    3fractionname "Управление полиции ЛВ - Генерал";
                                    case 
    4fractionname "ФБР - Директор ФБР";
                                }
                            }
                            case 
    7:
                            {
                                switch(
    PlayerInfo[i][pUnit])
                                {
                                    case 
    0fractionname "ТВ-Радио - Управляющий СМИ";
                                    case 
    1fractionname "Радиоцентр ЛС - Директор радиоцентра";
                                    case 
    2fractionname "Радиоцентр СФ - Директор радиоцентра";
                                    case 
    3fractionname "Радиоцентр ЛВ - Директор радиоцентра";
                                    case 
    4fractionname "Телецентр - Директор ТВ-Центра";
                                }
                            }
                            case 
    8:
                            {
                                switch(
    PlayerInfo[i][pUnit])
                                {
                                    case 
    0fractionname "Мин. Обороны - Министр обороны";
                                    case 
    1fractionname "Сухопутные войска - Генерал";
                                    case 
    2fractionname "Военно-Воздушные силы - Генерал";
                                    case 
    3fractionname "Военно-Морской флот - Адмирал";
                                }
                            }
                            case 
    9:
                            {
                                switch(
    PlayerInfo[i][pUnit])
                                {
                                    case 
    1fractionname "Администрация президента - Президент";
                                    case 
    2fractionname "Мэрия Лос-Сантос - Мэр города";
                                    case 
    3fractionname "Мэрия Сан-Фиерро - Мэр города";
                                    case 
    4fractionname "Мэрия Лас-Вентурас - Мэр города";
                                }
                            }
                            case 
    10fractionname "La Cosa Nostra - Don";
                            case 
    11fractionname "Yakuza - Кумитэ";
                            case 
    12fractionname "Русская Мафия - Вор в законе";
                            case 
    13:
                            {
                                switch(
    PlayerInfo[i][pUnit])
                                {
                                    case 
    0fractionname "Мин. Здравоохранения - Министр здравоохранения";
                                    case 
    1fractionname "Городская больница ЛС - Главный врач";
                                    case 
    2fractionname "Городская больница СФ - Главный врач";
                                    case 
    3fractionname "Городская больница ЛВ - Главный врач";
                                }
                            }
                        }
                        
    format(bigstringsizeof(bigstring), "%s%s - %s - %d\n"bigstringfractionnamePlayerInfo[i][pName], PlayerInfo[i][pPhone]);
                    }
                }
            }
            if(
    totalLeaders 0)
            {
                
    ShowPlayerDialog(playerid337DIALOG_STYLE_MSGBOX"{FFCC00}Лидеры организаций в сети:"bigstring"Закрыть","");
            }
            else
            {
                return 
    SendClientMessage(playeridCOLOR_GRAD2"В данный момент лидеров нет в сети.");
            }
            return 
    1;
        } 

  8. #6
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Придётся менять всю структуру кода.

  9. Пользователь сказал cпасибо:
    InCorrect (30.12.2015)
  10. #7
    Аватар для Profyan
    Пользователь

    Статус
    Оффлайн
    Регистрация
    23.12.2013
    Адрес
    Омск
    Сообщений
    196
    Репутация:
    22 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Доступ к одиночным переменным быстрее, чем к ячейкам массива. Если же больше 1 раза производится доступ к ячейке многомерного массива, то лучше заранее кэшировать содержимое этой ячейки в локальной переменной.



    Может всё-таки объясните, что именно было "до", а что "после"? Вы пока что показали только один отрывок кода.


    Ну вы же не собираетесь делать так, чтобы функция вызывала саму себя или другую функцию 50 раз?
    PHP код:
    Function1()
    {
        new array[
    100];
        return 
    Function2();
    }

    Function2()
    {
        new array[
    100];
        return 
    Function3();
    }

    // ...

    Function50()
    {
        new array[
    100];
        return 
    random(0);

    В программировании есть такое понятие, как блок: пространство, в пределах которого существуют локальные переменные.
    PHP код:
    SomeFunction()
    {
        new array[
    80];
        
    // ...

    В примере выше массив array будет существовать только пока выполняется функция. Как только функция завершит своё выполнение, она высвободит место в стеке, занятое под массив array.

    Ещё пример:
    PHP код:
    SomeFunction()
    {
        if(
    IsPlayerConnected(0))
        {
            new array[
    80];
            
    // #1
            // ...
        
    }
        else
        {
            
    // #2
            // ...
        
    }
        
    // #3

    Здесь array существует только внутри блока ветвления if (точка #1). Фукнция зарезервирует место в стеке, как только начнётся выполнение положительной ветки if, и высвободит его по окончании выполнения ветки, поэтому в местах #2 и #3 место в стеке под массив расходоваться не будет.
    Как происходит подсчет стека?Просто была такая ситуация, что локальные массивы убирал вообще, но стек не менялся. Т.е компилятор высчитывает в каком блоке используется самое большое кол-во байт??
    И еще: стек - это на весь мод, или стек - для каждого игрока.Если есть, например, функция и в ней массив(допустим) с 4000 ячейками.И если эта функция вызовется одновременно двумя игроками, то переполнение будет?(4000*4*2 = 32000 байт)



    Любой дурак может написать код, понятный компьютеру. Хороший программист пишет код, понятный человеку
    Мартин Фаулер


    Skype
    profan99
    VK
    click




  11. #8
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Цитата Сообщение от Profyan Посмотреть сообщение
    Как происходит подсчет стека?Просто была такая ситуация, что локальные массивы убирал вообще, но стек не менялся. Т.е компилятор высчитывает в каком блоке используется самое большое кол-во байт??
    И еще: стек - это на весь мод, или стек - для каждого игрока.Если есть, например, функция и в ней массив(допустим) с 4000 ячейками.И если эта функция вызовется одновременно двумя игроками, то переполнение будет?(4000*4*2 = 32000 байт)
    Стек для всех. Как минимум, переполнения из-за одной и той же функции не должно быть.

  12. Пользователь сказал cпасибо:
    InCorrect (30.12.2015)
  13. #9
    Аватар для InCorrect
    Пользователь

    Статус
    Оффлайн
    Регистрация
    30.12.2015
    Сообщений
    24
    Репутация:
    2 ±
    Еще такой вопросик, есть ли где-то с свободном доступе мод, который с легкостью выдержит онлайн в 1000 человек?

    UPD
    То бишь не стоит бояться ограничения в 16384 байт?

  14. #10
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Цитата Сообщение от InCorrect Посмотреть сообщение
    Еще такой вопросик, есть ли где-то с свободном доступе мод, который с легкостью выдержит онлайн в 1000 человек?
    Как минимум, почти все моды могут выдержать онлайн 1000, но, однако, не все могут удержать этот онлайн, например, из-за лагов и т.п. Все зависит от машины, а также от производительности мода.

    UPD:
    Цитата Сообщение от InCorrect Посмотреть сообщение
    То бишь не стоит бояться ограничения в 16384 байт?
    Стоит. Мод можно написать так, что стек кончится.
    Последний раз редактировалось VVWVV; 30.12.2015 в 13:42.

 

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

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

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

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

Ваши права

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