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

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,369
    Репутация:
    113 ±

    Ошибка с SendMes

    PHP код:
    [17:48:42] [debugServer crashed while executing beta45.amx
    [17:48:42] [debugAMX backtrace:
    [
    17:48:42] [debug#0 native format () from samp03svr
    [17:48:42] [debug#1 002387f8 in SendMes (playerid=1, color=-1347440726, fstring[]=@005a5ec8 "%s - %s[%d]", ... <3 arguments>) at D:\Program\Арбайтен\beta45.pwn:38401
    [17:48:42] [debug#2 00132b00 in public OnPlayerCommandText (playerid=1, cmdtext[]=@0061f654 "/leaders") at D:\Program\Арбайтен\beta45.pwn:23480 
    В гугле почти пусто насчёт этой темы)

     stock SendMes//стандартная как и в любом моде
    PHP код:
    stock SendMes(playeridcolorfstring[], {Float_}:...)
    {
        static const 
    STATIC_ARGS 3;
        new 
    = (numargs() - STATIC_ARGS) * BYTES_PER_CELL;
        if (
    n)
        {
            new 
    message[128], arg_startarg_end;
            
    #emit CONST.alt            fstring
            #emit LCTRL                5
            #emit ADD
            #emit STOR.S.pri        arg_start
            #emit LOAD.S.alt        n
            #emit ADD
            #emit STOR.S.pri        arg_end
            
    do
            {
                
    #emit LOAD.I
                #emit PUSH.pri
                
    arg_end -= BYTES_PER_CELL;
                
    #emit LOAD.S.pri    arg_end
            
    }
            while (
    arg_end arg_start);
            
    #emit PUSH.S            fstring
            #emit PUSH.C            128
            #emit PUSH.ADR            message

            
    += BYTES_PER_CELL 3;
            
    #emit PUSH.S            n
            #emit SYSREQ.C            format

            
    += BYTES_PER_CELL;
            
    #emit LCTRL                4
            #emit LOAD.S.alt        n
            #emit ADD
            #emit SCTRL                4
            
    return SCM(playeridcolormessage);
        }
        else return 
    SCM(playeridcolorfstring);

    [Anticheat]___Invisible Fly Hack
    [Anticheat]____Weapon/Ammo Hack
    [Function]______ResetPlayerWeaponSlot
    [Function]_______FIX_SetPlayerAmmo
    [ServerMod]______TDM | Zombie Apokalypse

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

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    1. Почему размер message 128?
    2. Покажи как вызываешь SendMes.
    3. Покажи строки 23480 и 38401.

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

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Сколько раз говорилось: "Не используйте SendMes". К тому же, данная функция - неправильна, т.к. неправильно задан размер массива.
    Вроде бы, с использованием простых Format и SendMes будет быстрее. К тому же, вы могли бы использовать функции strcat, которые намного быстрее, чем format.

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

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,369
    Репутация:
    113 ±
    Цитата Сообщение от ziggi Посмотреть сообщение
    1. Почему размер message 128?
    2. Покажи как вызываешь SendMes.
    3. Покажи строки 23480 и 38401.
    1. hz)) сделал 145
    2. Ниже это и есть строка 23480
    3.___________
    23480| SendMes(playerid,COLOR_GREY,"%s - %s[%d]",ttext,pInfo[i][pName],i);

    38401|
    Код:
    #emit SYSREQ.C	format
    n += BYTES_PER_CELL;
    #emit LCTRL	4
    [Anticheat]___Invisible Fly Hack
    [Anticheat]____Weapon/Ammo Hack
    [Function]______ResetPlayerWeaponSlot
    [Function]_______FIX_SetPlayerAmmo
    [ServerMod]______TDM | Zombie Apokalypse

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

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,369
    Репутация:
    113 ±
    Цитата Сообщение от VVWVV Посмотреть сообщение
    К тому же, вы могли бы использовать функции strcat, которые намного быстрее, чем format.
    Если я не ошибаюсь strcat для слепки многих строк и быстрее только когда много слепок надо, а у меня одна строка для форматирования..

    Я что залип на этой функции, смотрю написана на emit и прочих причудах павна,
    а на форуме об таких кодах говорят что это божественные коды, вот и залип в этой функции,
    ошибка всё равно осталась с правильным рассчётом..

    В общем я так понимаю надо переходить на обычный SCM и форматирование(уфф сколько в моде придётся копаться)
    [Anticheat]___Invisible Fly Hack
    [Anticheat]____Weapon/Ammo Hack
    [Function]______ResetPlayerWeaponSlot
    [Function]_______FIX_SetPlayerAmmo
    [ServerMod]______TDM | Zombie Apokalypse

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

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,369
    Репутация:
    113 ±
    Как мне перенести пачку аргументов с переменными в таком случае:
    (не сталкивался с таким и не знаю как правильно спросить)
    Код:
    stock SendMes(playerid, color, fstring[], {Float, _}:...)
    {
    	new skr[145];
    	format(skr, 145, fstring, {Float, _}:...);
    	SendClientMessage(playerid, color, skr);
    }
    Последний раз редактировалось vovandolg; 18.05.2016 в 16:22.
    [Anticheat]___Invisible Fly Hack
    [Anticheat]____Weapon/Ammo Hack
    [Function]______ResetPlayerWeaponSlot
    [Function]_______FIX_SetPlayerAmmo
    [ServerMod]______TDM | Zombie Apokalypse

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

    Статус
    Оффлайн
    Регистрация
    08.12.2015
    Адрес
    San Fierro
    Сообщений
    217
    Репутация:
    39 ±
    Такое не прокатит. Советую посмотреть на y_va. Однако намного лучше форматировать стандартными средствами.

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

    Статус
    Оффлайн
    Регистрация
    19.10.2013
    Адрес
    Ярославль
    Сообщений
    1,366
    Репутация:
    774 ±
    Цитата Сообщение от vovandolg Посмотреть сообщение
    Как мне перенести пачку аргументов с переменными в таком случае:
    (не сталкивался с таким и не знаю как правильно спросить)
    Код:
    stock SendMes(playerid, color, fstring[], {Float, _}:...)
    {
    	new skr[145];
    	format(skr, 145, fstring, {Float, _}:...);
    	SendClientMessage(playerid, color, skr);
    }
    В таком случае вам помогут функции getarg и numargs. Но не советую вам в будущем использовать эту функцию: при вызове данной функции вы будете постоянно использовать большое количество ненужных ячеек.

  11. 2 пользователя(ей) сказали cпасибо:
    vovandolg (18.05.2016) VVWVV (18.05.2016)
  12. #9
    Аватар для vovandolg
    Пользователь

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,369
    Репутация:
    113 ±
    Так и подумал что будет много излишки если так юзать, переведусь на обычное формат-ие
    Можно закрывать темку...
    [Anticheat]___Invisible Fly Hack
    [Anticheat]____Weapon/Ammo Hack
    [Function]______ResetPlayerWeaponSlot
    [Function]_______FIX_SetPlayerAmmo
    [ServerMod]______TDM | Zombie Apokalypse

  13. #10
    Аватар для Found
    G

    Статус
    Оффлайн
    Регистрация
    18.05.2016
    Адрес
    041b0438043f04
    Сообщений
    35
    Репутация:
    9 ±
    Цитата Сообщение от vovandolg Посмотреть сообщение
    Как мне перенести пачку аргументов с переменными в таком случае:
    (не сталкивался с таким и не знаю как правильно спросить)
    Код:
    stock SendMes(playerid, color, fstring[], {Float, _}:...)
    {
    	new skr[145];
    	format(skr, 145, fstring, {Float, _}:...);
    	SendClientMessage(playerid, color, skr);
    }
    Данную функцию можно использовать в сумме с глобальной переменной.
    Например:
    Мы объявим глобальную переменную:

    PHP код:
    new 
           
    global_string256 ]; 
    После этого, мы добавляем в тело функции, данный участок кода. (Иными словами, мы очищаем глобальную переменную)
    PHP код:
    global_string[0] = EOS
    Далее, нам необходимо будет статичные аргументы отделить от динамичных и пустить цикл, с которыми в свою очередь будут работать функции - getarg(...).

    Таким образом, глобальная переменная, будет автоматически очищаться при инициализации функции.
    Ну, а идеальный вариант, это конечно же использование директивы #define.
    PHP код:
    #define prepare(%0,%1,%2,%3) global_string[0] = EOS; format(global_string, sizeof global_string, %2, %3); SendClientMessage(%0, %1, %2) 
    Но опять же и здесь нас ожидают подводные камни.
    Например, будет проблема для тех, кто привык писать функции подобным образом:

    PHP код:
    prepareplayeridC_WHITE"Playerid: %d",
                     
    playerid
           
    ); 
    Последний раз редактировалось Found; 18.05.2016 в 19:15.

 

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

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

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

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

Ваши права

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