А как с динамическими текстами быть, допустим, объявления в News?
А как с динамическими текстами быть, допустим, объявления в News?
format не работает с упакованными строками! Читайте внимательней!
Так можно?
PHP код:
new BizzInfo[MAX_BIZZ][bInfo] = {
{0,!"The State","No-one", !"City Bank", -828.0927,1503.2441,19.6667, 1,2147.9228,1603.7501,1006.1677, 999000000,50,0,100,100,99984,15,500,205}
};
Последний раз редактировалось #Johnson; 22.06.2016 в 16:11.
- Данный способ не оптимизирует код, он лишь сокращает потребление сегмента данных, что способствует уменьшению размера файла. Возможно существует какая-то оптимизация, которая, может быть, увеличивает скорость выполнения кода, но это, как минимум, только лишь микросекунды.
- Кстати, в данной теме нет упоминания об обращении к элементу массива.
Del
Последний раз редактировалось Nash_Brigers; 23.06.2016 в 11:09.
Член сообщества Green Square.
Вы не читали статью до конца, так ведь?
Нет, я запрещаю.
Разве это так трудно проверить самостоятельно?
Советую ознакомиться со значением понятия оптимизации в информатике - это не только улучшение производительности.
http://pro-pawn.ru/showthread.php?13706
Смотря, как устроен вывод этих объявлений. Если текст объявления выводится непосредственно в момент его подачи игроком (например, прямо в команде /ad - ну или какая у вас там команда?), то нет смысла упаковывать текст, под который сервер и без того выделяет память в секции стека/кучи.
Другое дело, если тексты объявлений хранятся в каком-нибудь массиве строк, ожидая момента подачи в эфир (например, если сообщения перед выводом в эфир должны проходить проверку [s]цензором[/b] модератором).
Примерно так должен будет выглядеть массив для сообщений:
В секции данных выделится 129*8=1032 ячеек. Здесь уже есть смысл сократить размер последнего измерения массива и записывать в него упакованные строки.PHP код:
const MAX_AD_MESSAGES = 8;
const MAX_AD_MESSAGE_TEXT = 128;
new ad_messages[MAX_AD_MESSAGES][MAX_AD_MESSAGE_TEXT + 1];
new free_ad_message_slot = 0; // Здесь будет храниться номер слота, в который запишется очередное сообщение.
// При записи сообщения free_ad_message_slot увеличивается на 1. Если free_ad_message_slot больше или равно MAX_AD_MESSAGES,
// игроку выводится текст "слишком много сообщений в очереди, попробуйте позже".
В этом случае будет выделено всего 33*8=264 ячейки. Сохранение сообщений можно сделать с помощью strpack.PHP код:
new ad_messages[MAX_AD_MESSAGES][(MAX_AD_MESSAGE_TEXT + 1) char];
PHP код:
CMD:ad(playerid, params[])
{
// ...
strpack(ad_messages[free_ad_message_slot++], params, MAX_AD_MESSAGE_TEXT);
// ...
}
С функцией strpack тут всё в порядке, строка упаковывается правильно (в чём можно убедиться, логируя содержимое каждого байта в массиве string), проблема именно в ispacked.
Но всё же хотелось бы знать: откуда эта "информация проскочила"?
Я проверил на последней версии Pawn (4.0), там этот баг тоже есть. Можно сообщить о нём разработчику, но желательно будет упомянуть в багрепорте, кто изначально нашел баг, чтобы это не выглядело, как присвоение чужой находки. До этого я уже сообщал подобным образом о баге в strins.
Не то, чтобы это волшебным образом исправит баг в SA-MP (обновление до новой версии Pawn вряд ли вписывается в график стагнации мультиплеера), но... наверняка кто-нибудь другой пользуется Pawn 4.0 для проектов, не связанных с SA-MP.
Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
Стол заказов:
Мои работы:
Nash_Brigers (23.06.2016) VVWVV (23.06.2016)
Доброй ночи!
Можно задам вопрос, у меня 2 примера.
В 1 примере я могу использовать упакованные строки:
А во 2 примере НЕТ так как используется format:PHP код:
new string[] = !"текст",
string_1[] = !"текст",
string_2[] = !"текст";
string[sizeof( string ) -1] = '\n';
string_1[sizeof( string_1 ) -1] = '\n';
string_2[sizeof( string_2 ) -1] = '\0';
ShowPlayerDialog( playerid, 0, DIALOG_STYLE_MSGBOX, "Текст", string, "1", "2" );
Правильно понял?PHP код:
static const string[] = !"%s\nтекст";
new str[sizeof( string ) + ( -2 + MAX_PLAYER_NAME ) +1];
format( str, sizeof( str ), string, Player[playerid][Username] );
ShowPlayerDialog( playerid, 0, DIALOG_STYLE_INPUT, "Текст", string, "1", "2" );
Nurick, да. А первый пример можно сделать проще и без магии.
PHP код:
static string[] =
{
!"тут такой страшный и большой текст\n\
которого у меня, к сожалению, нет.\n\
поэтому я пищу этот бред"
};
ShowPlayerDialog(playerid, 0, DIALOG_STYLE_MSGBOX, !"текст", string, !"1", !"2");
Nurick (29.06.2016)
В твоём случае будет ошибка error 075: input line too long (входная строка слишком длинная), за это я использовал связку строк
Эту тему просматривают: 3 (пользователей: 0 , гостей: 3)