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

    Статус
    Оффлайн
    Регистрация
    10.05.2013
    Адрес
    Аҧсуа бызшәа
    Сообщений
    2,271
    Репутация:
    418 ±
    Одмееен, пикчи не грузятся

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от Salvacore Посмотреть сообщение
    Одмееен, пикчи не грузятся
    Уже успел заметить. Как приду домой - перезалью.

    UPD: Исправил картинки в теме.

    UPD[2]: Добавил PR (pull request) в репозиторий форка fixes.inc.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

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

    Статус
    Оффлайн
    Регистрация
    06.03.2016
    Адрес
    Moscow
    Сообщений
    167
    Репутация:
    44 ±
    Мужики, а не проще вот так делать?
    PHP код:
    SetPVarString(playerid"test_pvar_string""Тестовый текст.");

    new 
    t_str[20];
    GetPVarString(playerid"test_pvar_string"t_strsizeof(t_str));
    format(t_str20"%s"t_str);
    SendClientMessage(playerid0xFFFFFFFFt_str); 
    В конечном итоге в t_str записано всё чётко, без всякиях яяяяяпряяя..
    Последний раз редактировалось Nash_Brigers; 30.03.2016 в 12:37.

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от Nash_Brigers Посмотреть сообщение
    Мужики, а не проще вот так делать?
    PHP код:
    SetPVarString(playerid"test_pvar_string""Тестовый текст.");

    new 
    t_str[20];
    GetPVarString(playerid"test_pvar_string"t_strsizeof(t_str));
    format(t_str20"%s"t_str);
    SendClientMessage(playerid0xFFFFFFFFt_str); 
    В конечном итоге в t_str записано всё чётко, без всякиях яяяяяпряяя..
    По сути в format тот же баг, что и в printf, я описал его в 1-м посте: эти функции учитывают только 0-й байт в ячейке (по той же причине они не способны правильно работать с упакованными строками). Здесь же получается, что один баг может помочь обойти другой.
    Тем не менее, полагаться на баги (тем более, использовать один баг, чтобы избежать другого) - отнюдь не самая лучшая практика, т.к. этот баг со временем могут исправить. Я знаю, что в SA:MP не стоит ждать багфиксов, но в любом другом случае вас бы закидали помидорами (или чем-нибудь похуже).
    И на счёт простоты неплохо бы сделать тест и проверить производительность format в сравнении с предложенным мной циклом.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

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

    Статус
    Оффлайн
    Регистрация
    06.03.2016
    Адрес
    Moscow
    Сообщений
    167
    Репутация:
    44 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    но в любом другом случае вас бы закидали помидорами (или чем-нибудь похуже).
    Золотом?)

    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    И на счёт простоты неплохо бы сделать тест и проверить производительность format в сравнении с предложенным мной циклом.
    Проверил на миллионном цикле с JIT'ом.. При небольшом тексте Ваш метод выигрывает почти в два раза, при 144 символов уже одинаково с format'ом, при 288 символов - format уже почти на треть быстрее и т.д.
    p.s. подозреваю, что в формате не случайно этот "баг"...
    Последний раз редактировалось Nash_Brigers; 31.03.2016 в 12:59.

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Небольшое обновление:

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

      Открыть/закрыть

    1. int set_amxstring(AMX* amx, cell amx_addr, const char* source, int max)
    2. {
    3. cell* dest = (cell *)(amx->base + (int)(((AMX_HEADER *)amx->base)->dat + amx_addr));
    4. cell* start = dest;
    5. while (max--&&*source)
    6. *dest++=(cell)*source++;
    7. *dest = 0;
    8. return dest-start;
    9. }

    Обратите внимание на эту строку:
    1. *dest++=(cell)*source++;

    Как и предполагалось, при записи символа в массив Pawn происходит конверсия из char в cell, т.е. с расширением знакового бита. Значения больше 127 воспринимаются как отрицательные, например 128 - -128 (0x80), 129 - -127 (0x81), 130 - -126 (0x82), ..., 255 - -1 (0xFF), соответственно при конверсии в cell эти значения всё так же получаются отрицательными (0x80 => 0xFFFFFF80, 0x81 => 0xFFFFFF81, ..., 0xFF => 0xFFFFFFFF), со старшими байтами равными FF - отсюда и баг.
    Чтобы устранить эту проблему, достаточно указанную выше строку заменить на:
    1. *dest++=(cell)(unsigned char)*source++;

    После этого конверсия будет происходить из беззнакового типа (без расширения знакового бита) и баг будет устранён.


    P.S.: О первопричине бага и способе исправления я уже сообщил 0x452, баг исправлен в предстоящем релизе RW-MP.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  7. Пользователь сказал cпасибо:
    0x452 (10.05.2018)
 

 
Страница 2 из 2 ПерваяПервая 1 2

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

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

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

Ваши права

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