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

Тема: DC_CMD

  1. #1
    Аватар для Vano_Glad
    Пользователь

    Статус
    Оффлайн
    Регистрация
    06.07.2015
    Адрес
    Хабаровск
    Сообщений
    142
    Репутация:
    0 ±

    DC_CMD

    Такой вопрос. Тема касается не только этого командного процессора. Допустим есть проверка на все веденные аргументы в команде:

    PHP код:
    if(sscanf(params,"is[128]"params[0], params[1])) return
            
    SCM(playeridCOLOR_WHITE"Введите: /kick [id] [причина]); 
    И делаем следующее:

    PHP код:
    static const fmt_str[] = "Администратор %s кикнул игрока %s. Причина: %s";
    new 
    string[sizeof(fmt_str)-2+MAX_PLAYER_NAME-2+MAX_PLAYER_NAME-2+128]; 
    Как видно +128 и s[128]

    Нужно ли подсчитывать в string 128 ячеек для вывода текста, если в проверке я уже выставил длину? Или может я что-то не так понимаю, или может хитрость какая-то есть?
    ______________________________________________
    Услуги Pawn

  2. #2
    Аватар для Desulaid
    лесоруб продакшен

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    667
    Репутация:
    236 ±
    Массив ваш равен 217, когда лимит вам для SendClientMessage дан на 144 символа. Можно же в голове представить формулу 144 = x - (sizeof(fmt_str)-2*3+MAX_PLAYER_NAME*2). Алгебра 5 класс :)

    PHP код:
    static const fmt_str[] = "Администратор %s кикнул игрока %s. Причина: %s";
    new 
    string[144-(sizeof(fmt_str)-2*3+MAX_PLAYER_NAME*2)]; 
    А если залогируете размер, то узнаете размер для параметра

    PHP код:
    printf("%i"sizeof(string)); 
    ADD: а массив string надо тогда делать в 144 символа, причину, наверно, вы знаете.
    Последний раз редактировалось Desulaid; 09.02.2016 в 08:18.

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

    Статус
    Оффлайн
    Регистрация
    06.07.2015
    Адрес
    Хабаровск
    Сообщений
    142
    Репутация:
    0 ±
    Конкретного ответа я так и не получил. Видимо вы меня не правильно поняли. Я понял всю эту тему так: В s[128] - максимальная длина текста, которую я могу ввести, а в string длина должна быть не более 128 символов, следовательно я для s[128] вместо 128 должен подобрать такое число, чтобы оно уходило в остаток - верно?
    Последний раз редактировалось Vano_Glad; 09.02.2016 в 09:19.
    ______________________________________________
    Услуги Pawn

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    http://wiki.sa-mp.com/wiki/SendClientMessage
    If a message is longer than 144 characters, it will not be sent. Truncation can be used to prevent this. Displaying a message on multiple lines will also solve this issue.
    Btw, на строковый буфер следует выделять не 144, а 145 ячеек - надеюсь, не нужно напоминать, почему.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

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

    Статус
    Оффлайн
    Регистрация
    06.07.2015
    Адрес
    Хабаровск
    Сообщений
    142
    Репутация:
    0 ±
    Конкретного ответа я так и не получил. Видимо вы меня не правильно поняли. Я понял всю эту тему так: В s[128] - максимальная длина текста, которую я могу ввести, а в string длина должна быть не более 128 символов, следовательно я для s[128] вместо 128 должен подобрать такое число, чтобы оно уходило в остаток - верно?
    Что насчет этого? Тут я правильно мыслю?
    ______________________________________________
    Услуги Pawn

  6. #6
    Аватар для Desulaid
    лесоруб продакшен

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    667
    Репутация:
    236 ±
    Итак, еще раз, у тебя есть строка и формула, которая ни мои и ни твоя не совсем правильные. Так же, как и говорил DC, у нас есть строка в 145 символов. А теперь задачка, как вычислить x, если нам известны сумма и слагаемое?

    Пусть ИКС - разница, тогда 145 = икс + форума => x = 145 - форума;

    В роли "x" у нас массив. Просто не знаю еще как рассказать 9((

    PHP код:
    static const fmt_str[] = "Администратор %s кикнул игрока %s. Причина: %s";
    new 
    string[145-(sizeof(fmt_str)-2*3+((MAX_PLAYER_NAME+1)*2))];
    printf("ИКС равен = %i"sizeof(string)); 
    Вот и смотри свой остаток. А конкретный ответ - цифра? Если так, то после такого ответа ты ничего не поймешь и будешь задавать однотипные вопросы..

  7. Пользователь сказал cпасибо:
    Vano_Glad (09.02.2016)
  8. #7
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Зачем считать размер, если SCM всё равно не выведет больше 144 символов?
    Нужно только узнать длину строки c причиной бана в sscanf. Я точно не помню максимальную длину строки params, но вы можете найти её опытным путём, а потом отнять 2 (1 на пробел между параметрами и ещё 1 - минимальная длина ID игрока).
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  9. Пользователь сказал cпасибо:
    Vano_Glad (09.02.2016)
  10. #8
    Аватар для Vano_Glad
    Пользователь

    Статус
    Оффлайн
    Регистрация
    06.07.2015
    Адрес
    Хабаровск
    Сообщений
    142
    Репутация:
    0 ±
    Я все понял :) Спасибо всем. Тема закрыта
    ______________________________________________
    Услуги Pawn

  11. #9
    Аватар для Desulaid
    лесоруб продакшен

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    667
    Репутация:
    236 ±
    Я на это и намекал. Размер будет равен 54, а в массив string запихнуть число 145 и все.

    Что-то типа

    PHP код:
    COMMAND:kick(playeridparams[])
    {
        new 
    targetidname[MAX_PLAYER_NAME+1], string[145];
        if(
    sscanf(params"us[52]"targetidparams))
            return 
    0;
        
    GetPlayerName(targetidnamesizeof(name));
        
    GetPlayerName(playeridstringsizeof(name));
        
    format(stringsizeof(string), "Администратор %s кикнул игрока %s. Причина: %s"stringnameparams);
        
    SendClientMessageToAll(-1string);
        
    Kick(targetid);
        return 
    1;


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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от Untonyst Посмотреть сообщение
    Я на это и намекал. Размер будет равен 54, а в массив string запихнуть число 145 и все.

    Что-то типа

    PHP код:
    COMMAND:kick(playeridparams[])
    {
        new 
    targetidname[MAX_PLAYER_NAME+1], string[145];
        if(
    sscanf(params"us[52]"targetidparams))
            return 
    0;
        
    GetPlayerName(targetidnamesizeof(name));
        
    GetPlayerName(playeridstringsizeof(name));
        
    format(stringsizeof(string), "Администратор %s кикнул игрока %s. Причина: %s"stringnameparams);
        
    SendClientMessageToAll(-1string);
        
    Kick(targetid);
        return 
    1;

    В причине бана игрок может ввести больше 52 символов - словишь варнинг от sscanf.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

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

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

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

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

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

Ваши права

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