Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.

Реклама


**Как получить V.I.P** (Перейти)
Чтобы заказать рекламу на Pro-Pawn.Ru, обращайтесь в Skype.
Баннерная реклама 200руб/мес, Текстовая 100руб/мес.
Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 11
  1. #1
    Аватар для gambit26
    Пользователь

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

    Оптимизация /members

    Писал команду /members. Захотел сделать так, чтобы список игроков сортировался по рангу. В общем в силу скромных знаний и любви к костылям, получилось нечто:

    PHP код:
    CMD:members(playeridparams[])
    {
        new 
    string[1000];
        if(
    PlayerInfo[playerid][pMember] > 0)
        {
            new 
    i;
            
    format(stringsizeof(string), ""COL_YELLOW"Сотрудники Online:");
            foreach(
    Player)
            {
                if(!
    IsAValidPlayer(i)) continue;
                if(
    PlayerInfo[i][pMember] != PlayerInfo[playerid][pMember]) continue;
                if(
    PlayerInfo[i][pRank] != 10) continue;
                
    format(stringsizeof(string), "%s\n{FFFFFF}  %s | ID: %d | %s [%d]",string,PlayerInfo[i][pName],i,PlayerInfo[i][pRankName],PlayerInfo[i][pRank]);
            }
            foreach(
    Player)
            {
                if(!
    IsAValidPlayer(i)) continue;
                if(
    PlayerInfo[i][pMember] != PlayerInfo[playerid][pMember]) continue;
                if(
    PlayerInfo[i][pRank] != 9) continue;
                
    format(stringsizeof(string), "%s\n{FFFFFF}  %s | ID: %d | %s [%d]",string,PlayerInfo[i][pName],i,PlayerInfo[i][pRankName],PlayerInfo[i][pRank]);
            }
            foreach(
    Player)
            {
                if(!
    IsAValidPlayer(i)) continue;
                if(
    PlayerInfo[i][pMember] != PlayerInfo[playerid][pMember]) continue;
                if(
    PlayerInfo[i][pRank] != 8) continue;
                
    format(stringsizeof(string), "%s\n{FFFFFF}  %s | ID: %d | %s [%d]",string,PlayerInfo[i][pName],i,PlayerInfo[i][pRankName],PlayerInfo[i][pRank]);
            }
            foreach(
    Player)
            {
                if(!
    IsAValidPlayer(i)) continue;
                if(
    PlayerInfo[i][pMember] != PlayerInfo[playerid][pMember]) continue;
                if(
    PlayerInfo[i][pRank] != 7) continue;
                
    format(stringsizeof(string), "%s\n{FFFFFF}  %s | ID: %d | %s [%d]",string,PlayerInfo[i][pName],i,PlayerInfo[i][pRankName],PlayerInfo[i][pRank]);
            }
            foreach(
    Player)
            {
                if(!
    IsAValidPlayer(i)) continue;
                if(
    PlayerInfo[i][pMember] != PlayerInfo[playerid][pMember]) continue;
                if(
    PlayerInfo[i][pRank] != 6) continue;
                
    format(stringsizeof(string), "%s\n{FFFFFF}  %s | ID: %d | %s [%d]",string,PlayerInfo[i][pName],i,PlayerInfo[i][pRankName],PlayerInfo[i][pRank]);
            }
            foreach(
    Player)
            {
                if(!
    IsAValidPlayer(i)) continue;
                if(
    PlayerInfo[i][pMember] != PlayerInfo[playerid][pMember]) continue;
                if(
    PlayerInfo[i][pRank] != 5) continue;
                
    format(stringsizeof(string), "%s\n{FFFFFF}  %s | ID: %d | %s [%d]",string,PlayerInfo[i][pName],i,PlayerInfo[i][pRankName],PlayerInfo[i][pRank]);
            }
            foreach(
    Player)
            {
                if(!
    IsAValidPlayer(i)) continue;
                if(
    PlayerInfo[i][pMember] != PlayerInfo[playerid][pMember]) continue;
                if(
    PlayerInfo[i][pRank] != 4) continue;
                
    format(stringsizeof(string), "%s\n{FFFFFF}  %s | ID: %d | %s [%d]",string,PlayerInfo[i][pName],i,PlayerInfo[i][pRankName],PlayerInfo[i][pRank]);
            }
            foreach(
    Player)
            {
                if(!
    IsAValidPlayer(i)) continue;
                if(
    PlayerInfo[i][pMember] != PlayerInfo[playerid][pMember]) continue;
                if(
    PlayerInfo[i][pRank] != 3) continue;
                
    format(stringsizeof(string), "%s\n{FFFFFF}  %s | ID: %d | %s [%d]",string,PlayerInfo[i][pName],i,PlayerInfo[i][pRankName],PlayerInfo[i][pRank]);
            }
            foreach(
    Player)
            {
                if(!
    IsAValidPlayer(i)) continue;
                if(
    PlayerInfo[i][pMember] != PlayerInfo[playerid][pMember]) continue;
                if(
    PlayerInfo[i][pRank] != 2) continue;
                
    format(stringsizeof(string), "%s\n{FFFFFF}  %s | ID: %d | %s [%d]",string,PlayerInfo[i][pName],i,PlayerInfo[i][pRankName],PlayerInfo[i][pRank]);
            }
            foreach(
    Player)
            {
                if(!
    IsAValidPlayer(i)) continue;
                if(
    PlayerInfo[i][pMember] != PlayerInfo[playerid][pMember]) continue;
                if(
    PlayerInfo[i][pRank] != 1) continue;
                
    format(stringsizeof(string), "%s\n{FFFFFF}  %s | ID: %d | %s [%d]",string,PlayerInfo[i][pName],i,PlayerInfo[i][pRankName],PlayerInfo[i][pRank]);
            }
            return 
    SPD(playerid0DSM"{00BFFF}Работники"string"Закрыть""");
        }
        return 
    SCM(playeridCOLOR_GREY" Вам недоступна эта команда");

    Разумеется, вопрос: что можно с этим сделать?

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

    Статус
    Оффлайн
    Регистрация
    07.11.2015
    Сообщений
    1
    Репутация:
    0 ±
    PHP код:
    new i
    убери, в foreach объявлена и так перменная...

    Зачем столько раз использовать цыкл
    PHP код:
    foreach 
    если можно один раз а там через
    PHP код:
    switch(Player[i][Rang]) 
    PHP код:
    format(stringsizeof(string), ""COL_YELLOW"Сотрудники Online:"); 
    замени на
    PHP код:
    SendClientMessage(playeridCOL_YELLOW"Сотрудники Online:"); 
    PHP код:
    new string[1000]; 
    это очень большой массив.....

  3. #3
    Аватар для VVWVV
    Проверенный

    Статус
    Онлайн
    Регистрация
    09.07.2015
    Сообщений
    607
    Репутация:
    289 ±
    У вас в коде очень большое количество циклов, их можно заменить на один. Так же, очень много ненужных проверок. Советую прочитать все темы про оптимизацию кода(Вы сможете найти их на данном сайте, а так же на официальном сайте: SA:MP).

    Вот ваша оптимизированная команда:
    PHP код:
    CMD:members(playeridparams[]) 
    {
        
    #define MAX_LINES (10)
        
    if (PlayerInfo[playerid][pMember] == 0)
            return 
    SCM(playeridCOLOR_GREY, !"Вам недоступна эта команда");
        static const
            
    sFrmStr[] = "{FFFFFF} %s | ID: %d | %s[%d]\n";
        const
            
    iFStrLen sizeof sFrmStr + (-4) + MAX_PLAYER_NAME 2;
        new
            
    _sBuffStr[iFStrLen],
            
    sOutt[iFStrLen MAX_LINES] = "Сотрудники Online:\n";
        
    #undef MAX_LINES
        
    foreach(new iPlayer)
        {
            if (!
    IsAValidPlayer(i) || PlayerInfo[i][pMember] != PlayerInfo[playerid][pMember])
                continue;
            
    format(_sBuffStrsizeof _sBuffStrsFrmStrPlayerInfo[i][pName], iPlayerInfo[i][pRankName], PlayerInfo[i][pRank]);
            
    strcat(sOutt_sBuffStr);
        }
        return 
    SPD(playerid0DSM, !"{00BFFF}Работники"_sBuffStr, !"Закрыть", !"");

    Вы можете изменить количество выводимых строк, заменив значение костанты «MAX_LINES».
    Так же советую вам, не записывать название рангов в массив с игроком.
    Последний раз редактировалось VVWVV; 30.11.2015 в 16:09.

  4. 2 пользователя(ей) сказали cпасибо:
    Londlem (30.11.2015)Sp1ke (30.11.2015)
  5. #4
    Аватар для Daniel_Cortez
    new fuck_logic[0] = EOS;

    Статус
    Онлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    1,652
    Репутация:
    2144 ±
    1. Зачем использовать format, если вы не форматируете текст, а только копируете его?
    2. Избавьтесь от китайского кода и поместите foreach в ещё один цикл, в котором будут перебираться ранги от 10 до 1.
    3. Вы храните название ранга в аккаунте?
    PHP код:
    PlayerInfo[i][pRankName
    Во-первых, достаточно создать глобальную таблицу с названиями рангов для всех организаций, а в аккаунте хранить только номер ранга.
    Во-вторых, что вы будете делать, если захотите переименовать какой-нибудь ранг? Обшаривать не только мод, но и каждый аккаунт и заменять все совпадения?
    4. Вместо того, чтобы 9 раз проверять подключение каждого игрока, статус логина и принадлежность к организации, можно сделать массив для ID игроков, один раз пройтись по всем игрокам (foreach), сохранить нужные ID в массив и уже их перебирать 9 раз, но уже с помощью цикла for. Можно создать массив из MAX_PLAYERS ячеек, это будет самый простой способ (и самый быдлокодерский, т.к. при 1000 игроках таким массивом будет использоваться 1/4 стекового пространства, а ведь ещё есть массив string!), но лучше будет подсчитать, сколько строк ("%s\n{FFFFFF} ...", с учётом минимальных размеров форматируемых значений) вместится в массив string - именно столько ячеек достаточно будет под массив для ID нужных игроков (сложно, но можно).


    Цитата Сообщение от VVWVV Посмотреть сообщение
    У вас в коде очень большое количество циклов, их можно заменить на один.
    Так и было задумано у ТС: выводить сначала высшие ранги, потом низшие, по убыванию. Поэтому ваша реализация не совсем правильная.


    Цитата Сообщение от AavaiableRp Посмотреть сообщение
    PHP код:
    new i
    убери, в foreach объявлена и так перменная...

    Зачем столько раз использовать цыкл
    PHP код:
    foreach 
    если можно один раз а там через
    PHP код:
    switch(Player[i][Rang]) 
    Так и было задумано. Правильнее будет заменить вложенными циклами [2].


    Цитата Сообщение от AavaiableRp Посмотреть сообщение
    PHP код:
    format(stringsizeof(string), ""COL_YELLOW"Сотрудники Online:"); 
    замени на
    PHP код:
    SendClientMessage(playeridCOL_YELLOW"Сотрудники Online:"); 
    Эта строка выводится в диалог...


    Цитата Сообщение от AavaiableRp Посмотреть сообщение
    PHP код:
    new string[1000]; 
    это очень большой массив.....
    Размер вполне оправдан, т.к. игроков в организации может оказаться много. Не факт, что ещё хватит 1000.
    Индивидуально в PM и Skype по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
    SA-MP 0.4 is a lie

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

    Статус
    Оффлайн
    Регистрация
    30.11.2015
    Сообщений
    30
    Репутация:
    0 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    1. Зачем использовать format, если вы не форматируете текст, а только копируете его?
    2. Избавьтесь от китайского кода и поместите foreach в ещё один цикл, в котором будут перебираться ранги от 10 до 1.
    3. Вы храните название ранга в аккаунте?

    Во-первых, достаточно создать глобальную таблицу с названиями рангов для всех организаций, а в аккаунте хранить только номер ранга.
    Во-вторых, что вы будете делать, если захотите переименовать какой-нибудь ранг? Обшаривать не только мод, но и каждый аккаунт и заменять все совпадения?
    4. Вместо того, чтобы 9 раз проверять подключение каждого игрока, статус логина и принадлежность к организации, можно сделать массив для ID игроков, один раз пройтись по всем игрокам (foreach), сохранить нужные ID в массив и уже их перебирать 9 раз, но уже с помощью цикла for. Можно создать массив из MAX_PLAYERS ячеек, это будет самый простой способ (и самый быдлокодерский, т.к. при 1000 игроках таким массивом будет использоваться 1/4 стекового пространства, а ведь ещё есть массив string!), но лучше будет подсчитать, сколько строк ("%s\n{FFFFFF} ...", с учётом минимальных размеров форматируемых значений) вместится в массив string - именно столько ячеек достаточно будет под массив для ID нужных игроков (сложно, но можно).
    1. Я ведь добавляю новый к существующему. Первая переменная в format стоит string. Я так понял, что это неправильно, но не пойму, как тогда следует поступить.
    2. Не думал, что "цикл в цикле" будет работать.
    3. У меня все названия рангов хранятся в массивах. При, допустим, коннекте, для игрока находится нужный ранг в массиве и записывается в PlayerInfo[playerid][pRankName];
    4. Как пройтись по игрокам я, слава богу, понимаю. Но как нужные ID сохранить в массив?

  7. #6
    Аватар для Daniel_Cortez
    new fuck_logic[0] = EOS;

    Статус
    Онлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    1,652
    Репутация:
    2144 ±
    Цитата Сообщение от gambit26 Посмотреть сообщение
    1. Я ведь добавляю новый к существующему. Первая переменная в format стоит string. Я так понял, что это неправильно, но не пойму, как тогда следует поступить.
    Забыл сказать, это относилось только к 1-му использованию format.
    PHP код:
    format(stringsizeof(string), ""COL_YELLOW"Сотрудники Online:"); 

    Цитата Сообщение от gambit26 Посмотреть сообщение
    2. Не думал, что "цикл в цикле" будет работать.
    Почему бы и нет? Компилятором Pawn поддерживается до 24 вложенных друг в друга циклов (этот лимит можно расширить, покопавшись в исходниках компилятора - нужно лишь увеличить размер wqTABSZ в sc.h).


    Цитата Сообщение от gambit26 Посмотреть сообщение
    3. У меня все названия рангов хранятся в массивах. При, допустим, коннекте, для игрока находится нужный ранг в массиве и записывается в PlayerInfo[playerid][pRankName];
    Можно, но нафига? Если у вас уже есть таблица названий рангов, зачем плодить лишние копии этих названий в каждом аккаунте?
    У игрока есть номер ранга? Есть. Чтобы узнать название ранга, достаточно взять ID организации и номер ранга в аккаунте и по ним найти название в таблице. Сложите 2 и 2.


    Цитата Сообщение от gambit26 Посмотреть сообщение
    4. Как пройтись по игрокам я, слава богу, понимаю. Но как нужные ID сохранить в массив?
    Я не зря сделал этот пункт самым последним, т.к. он сложен в реализации.
    Если сделать массив на 1000 (MAX_PLAYERS) ячеек, это будет явным расточительством, т.к. данные о стольких игроках не влезут в string.
    Как я уже писал, разумнее будет подсчитать макс. кол-во строк и получившееся число взять как размер массива игроков.
    Вот то, что получилось у меня:
      Открыть/закрыть
    PHP код:
    CMD:members(playeridparams[])
    {
        new 
    family PlayerInfo[playerid][pMember];
        if (
    family == 0)
            
    family PlayerInfo[playerid][pLeader];
        if (
    family == 0)
            return 
    SendClientMessage(playeridCOLOR_GREY, !"Вы не состоите ни в одной из банд/мафий/фракций.");
        static const 
    fmt_str[] = "\n{FFFFFF}%s | ID: %d | %s[%d]";
        
    // Расчёт размера буфера для форматирования.
        
    const buffer_size sizeof(fmt_str)
            +  (-
    MAX_PLAYER_NAME)
            +  (-
    5// ID игрока, в будущих версиях SA:MP значение MAX_PLAYERS
                        // может увеличиться вплоть до 65535 (5 символов).
            
    +  (-20)// Максимальная длина названия ранга - 20 символов (?)
                        // (если больше или меньше, ставьте своё значение).
            
    +  (-2);// Номер ранга - не больше 10 (2 символа).
        // Расчёт макс. количества строк в диалоге.
        
    const MAX_ENTRIES 2048 buffer_size;
        
    // Первая часть строки string будет упакованной, поэтому strcat
        // будет автоматически упаковывать новые строки при добавлении их к string.
        // Благодаря этому в string можно будет вместить в 4 раза больше текста.
        
    static const first_str[] = !"Сотрудники Online:";
        new 
    string[buffer_size MAX_ENTRIES];
        
    string first_str;
        new 
    string_len sizeof(first_str) - 1;
        new 
    buffer[buffer_size];
        
    // Проходим по всем игрокам и "запоминаем" нужных.
        
    new players[MAX_ENTRIES], players_count 0;
        foreach(new 
    iPlayer)
        {
            
    //if (!IsAValidPlayer(i))
            
    if (== gPlayerLogged[i])
                continue;
            if (
    PlayerInfo[i][pMember] != family)
                continue;
            
    players[players_count++] = i;
        }
        
    // Теперь в цикле проверяем ранги от 10 до 1.
        
    if (players_count == 0)
            goto 
    show_dialog;
        for (new 
    rank 11xi; --rank != 0;)
        {
            
    // Проходим по всем кэшированным игрокам.
            
    for (= -1; ++players_count;)
            {
                
    // Если у игрока искомый ранг - добавляем новую строку в диалог.
                
    if ((players[x]) != rank)
                    continue;
                
    format(
                    
    buffersizeof(string), fmt_str,
                    
    //PlayerInfo[i][pName], i,
                    //PlayerInfo[i][pRankName], PlayerInfo[i][pRank]
                    
    bufferiRankName(playerid), PlayerInfo[i][pRank]
                );
                
    // Добавить сформатированный результат к строке string
                // и подсчитать её длину после добавления.
                
    string_len += strcat(stringbuffer);
                
    // Если в организации много игроков и в string не хватает
                // свободного места для новой строки - переходим к показу диалога.
                
    if (string_len sizeof(buffer) < sizeof(string))
                    continue;
                goto 
    show_dialog;
            }
        }
    show_dialog:
        
    //return SPD(playerid, 0, DSM, !"{00BFFF}Работники", string, !"Закрыть", !"");
        
    return ShowPlayerDialog(
            
    playerid0DIALOG_STYLE_MSGBOX,
            !
    "{00BFFF}Работники"string, !"Закрыть", !""
        
    );


    Код получился даже сложнее, чем в 1-м посте, но он не будет казаться таким раздутым, если убрать из него комментарии.
    К тому же, я постарался сделать его как можно более производительным.
    Индивидуально в PM и Skype по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
    SA-MP 0.4 is a lie

  8. 6 пользователя(ей) сказали cпасибо:
    #Vito (03.12.2015)gambit26 (03.12.2015)Londlem (01.12.2015)Nurick (01.12.2015)StevenH (01.12.2015)VVWVV (01.12.2015)
  9. #7
    Аватар для StevenH
    Пользователь

    Статус
    Оффлайн
    Регистрация
    13.10.2015
    Сообщений
    467
    Репутация:
    13 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Забыл сказать, это относилось только к 1-му использованию format.




    Почему бы и нет? Компилятором Pawn поддерживается до 24 вложенных друг в друга циклов (этот лимит можно расширить, покопавшись в исходниках компилятора - нужно лишь увеличить размер wqTABSZ в sc.h).



    Можно, но нафига? Если у вас уже есть таблица названий рангов, зачем плодить лишние копии этих названий в каждом аккаунте?
    У игрока есть номер ранга? Есть. Чтобы узнать название ранга, достаточно взять ID организации и номер ранга в аккаунте и по ним найти название в таблице. Сложите 2 и 2.



    Я не зря сделал этот пункт самым последним, т.к. он сложен в реализации.
    Если сделать массив на 1000 (MAX_PLAYERS) ячеек, это будет явным расточительством, т.к. данные о стольких игроках не влезут в string.
    Как я уже писал, разумнее будет подсчитать макс. кол-во строк и получившееся число взять как размер массива игроков.
    Вот то, что получилось у меня:
      Открыть/закрыть
    PHP код:
    CMD:members(playeridparams[])
    {
        new 
    family PlayerInfo[playerid][pMember];
        if (
    family == 0)
            
    family PlayerInfo[playerid][pLeader];
        if (
    family == 0)
            return 
    SendClientMessage(playeridCOLOR_GREY, !"Вы не состоите ни в одной из банд/мафий/фракций.");
        static const 
    fmt_str[] = "\n{FFFFFF}%s | ID: %d | %s[%d]";
        
    // Расчёт размера буфера для форматирования.
        
    const buffer_size sizeof(fmt_str)
            +  (-
    MAX_PLAYER_NAME)
            +  (-
    5// ID игрока, в будущих версиях SA:MP значение MAX_PLAYERS
                        // может увеличиться вплоть до 65535 (5 символов).
            
    +  (-20)// Максимальная длина названия ранга - 20 символов (?)
                        // (если больше или меньше, ставьте своё значение).
            
    +  (-2);// Номер ранга - не больше 10 (2 символа).
        // Расчёт макс. количества строк в диалоге.
        
    const MAX_ENTRIES 2048 buffer_size;
        
    // Первая часть строки string будет упакованной, поэтому strcat
        // будет автоматически упаковывать новые строки при добавлении их к string.
        // Благодаря этому в string можно будет вместить в 4 раза больше текста.
        
    static const first_str[] = !"Сотрудники Online:";
        new 
    string[buffer_size MAX_ENTRIES];
        
    string first_str;
        new 
    string_len sizeof(first_str) - 1;
        new 
    buffer[buffer_size];
        
    // Проходим по всем игрокам и "запоминаем" нужных.
        
    new players[MAX_ENTRIES], players_count 0;
        foreach(new 
    iPlayer)
        {
            
    //if (!IsAValidPlayer(i))
            
    if (== gPlayerLogged[i])
                continue;
            if (
    PlayerInfo[i][pMember] != family)
                continue;
            
    players[players_count++] = i;
        }
        
    // Теперь в цикле проверяем ранги от 10 до 1.
        
    if (players_count == 0)
            goto 
    show_dialog;
        for (new 
    rank 11xi; --rank != 0;)
        {
            
    // Проходим по всем кэшированным игрокам.
            
    for (= -1; ++players_count;)
            {
                
    // Если у игрока искомый ранг - добавляем новую строку в диалог.
                
    if ((players[x]) != rank)
                    continue;
                
    format(
                    
    buffersizeof(string), fmt_str,
                    
    //PlayerInfo[i][pName], i,
                    //PlayerInfo[i][pRankName], PlayerInfo[i][pRank]
                    
    bufferiRankName(playerid), PlayerInfo[i][pRank]
                );
                
    // Добавить сформатированный результат к строке string
                // и подсчитать её длину после добавления.
                
    string_len += strcat(stringbuffer);
                
    // Если в организации много игроков и в string не хватает
                // свободного места для новой строки - переходим к показу диалога.
                
    if (string_len sizeof(buffer) < sizeof(string))
                    continue;
                goto 
    show_dialog;
            }
        }
    show_dialog:
        
    //return SPD(playerid, 0, DSM, !"{00BFFF}Работники", string, !"Закрыть", !"");
        
    return ShowPlayerDialog(
            
    playerid0DIALOG_STYLE_MSGBOX,
            !
    "{00BFFF}Работники"string, !"Закрыть", !""
        
    );


    Код получился даже сложнее, чем в 1-м посте, но он не будет казаться таким раздутым, если убрать из него комментарии.
    К тому же, я постарался сделать его как можно более производительным.
    Вау! Вот это код!!

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

    Статус
    Оффлайн
    Регистрация
    30.11.2015
    Сообщений
    30
    Репутация:
    0 ±
    всё вроде бы понял. кроме этого

    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    PHP код:
        const buffer_size sizeof(fmt_str)
            +  (-
    MAX_PLAYER_NAME)
            +  (-
    5// ID игрока, в будущих версиях SA:MP значение MAX_PLAYERS
                        // может увеличиться вплоть до 65535 (5 символов).
            
    +  (-20)// Максимальная длина названия ранга - 20 символов (?)
                        // (если больше или меньше, ставьте своё значение).
            
    +  (-2); 
    [/spoiler]

    почему -2?

  11. #9
    Аватар для untonyst
    Младший сержант

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    664
    Репутация:
    234 ±
    Код:
    static const fmt_str[] = "\n{FFFFFF}%s | ID: %d | %s[%d]";
    const buffer_size = sizeof(fmt_str) +  (-2 + MAX_PLAYER_NAME) +  (-2 + 5) +  (-2 + 20)  +  (-2 + 2);
    Младший сержант Стяжкин | ЧСВ группа в ВКонтакте NEW

  12. 2 пользователя(ей) сказали cпасибо:
    Daniel_Cortez (02.12.2015)gambit26 (03.12.2015)
  13. #10
    Аватар для gambit26
    Пользователь

    Статус
    Оффлайн
    Регистрация
    30.11.2015
    Сообщений
    30
    Репутация:
    0 ±
    Цитата Сообщение от Untonyst Посмотреть сообщение
    Код:
    static const fmt_str[] = "\n{FFFFFF}%s | ID: %d | %s[%d]";
    const buffer_size = sizeof(fmt_str) +  (-2 + MAX_PLAYER_NAME) +  (-2 + 5) +  (-2 + 20)  +  (-2 + 2);
    понял. спасибо вам обоим

 

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

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

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

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

Ваши права

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