PDA

Просмотр полной версии : [Вопрос] Вопрос по format



stimorol
19.02.2016, 14:11
Всем привет!

Возник вопрос о использовании format в диалогах, а конкретней, это выделяемое количество символов для формата.

Код (пример):


new text[60];
forman(string, sizeof(string), "Никнейм персонажа: %s\n\nВведите пароль:", pNick(playerid));
ShowPlayerDialog(playerid, dLogin, DIALOG_STYLE_INPUT, "Авторизация", string, "Готово", "Выход");


Я не хочу всё время создавать переменную "text". Хочу создать одну глобальную переменную, допустим на 2000 символов, и потом выделять определённое количество символов для такого или иного формата (типо того, который я привёл в примере).

Как это сделать? Если не сложно, объясните пожалуйста всё подробно:)

vovandolg
19.02.2016, 15:06
Лучше создавать каждый раз чтобы она автоматически очищалась.

Profyan
19.02.2016, 18:33
Это можно использовать для разных систем,где не используется вывод текста для определенного игрока.
Я уже много где видел,да и сам использую:
• Для игроков глобальный массив player_str[MAX_PLAYERS][1024]; - например. И тогда,уже в определенных системах ты форматируешь строку,правда, во втором параметре format размер форматируемой строки не указать(вроде бы) и придется указывать полный размер массива.В данном случае это 1024: format(player_str[playerid],1024, ""); После\перед каждым форматированием нужно очищать массив:
player_str[playerid] = "\0"; или так - player_str[playerid][0] = EOS;.Т.е мы не полностью очищаем массив,а только изменяем его первый байт на нуль символ.Для удобности можно создать функцию\макрос для автоматического очищения.
• Для разных систем system_str[1024]; - пример. И его нужно тоже очищать.

stimorol
19.02.2016, 18:41
Это можно использовать для разных систем,где не используется вывод текста для определенного игрока.
Я уже много где видел,да и сам использую:
• Для игроков глобальный массив player_str[MAX_PLAYERS][1024]; - например. И тогда,уже в определенных системах ты форматируешь строку,правда, во втором параметре format размер форматируемой строки не указать(вроде бы) и придется указывать полный размер массива.В данном случае это 1024: format(player_str[playerid],1024, ""); После\перед каждым форматированием нужно очищать массив:
player_str[playerid] = "\0"; или так - player_str[playerid][0] = EOS;.Т.е мы не полностью очищаем массив,а только изменяем его первый байт на нуль символ.Для удобности можно создать функцию\макрос для автоматического очищения.
• Для разных систем system_str[1024]; - пример. И его нужно тоже очищать.

Спасибо огромное за информацию!

Daniel_Cortez
20.02.2016, 10:56
Для игроков глобальный массив player_str[MAX_PLAYERS][1024]; - например.
Зачем делать для каждого игрока свой буфер, если SA:MP однопоточен и можно обойтись одним?



После\перед каждым форматированием нужно очищать массив:
player_str[playerid] = "\0"; или так - player_str[playerid][0] = EOS;.
Для чего может понадобиться чистить буфер, если его содержимое до форматирования не повлияет на результат выполнения format?



Для разных систем system_str[1024]; - пример. И его нужно тоже очищать.
Опять же, SA:MP однопоточен и для форматирования достаточно одного глобального массива.



Я не хочу всё время создавать переменную "text". Хочу создать одну глобальную переменную, допустим на 2000 символов, и потом выделять определённое количество символов для такого или иного формата (типо того, который я привёл в примере).
Во-первых, неправильно говорить "массив на 200 ячеек", т.к. строки могут быть упакованными и в одну ячейку массива можно уместить целых 4 символа.
Во-вторых, в Pawn нет массивов с динамическим размером. Если объявить массив на 2000 ячеек, в нём будет (сюрприз!) 2000 ячеек, не больше и не меньше.

Profyan
20.02.2016, 13:38
Зачем делать для каждого игрока свой буфер, если SA:MP однопоточен и можно обойтись одним?



Для чего может понадобиться чистить буфер, если его содержимое до форматирования не повлияет на результат выполнения format?



Опять же, SA:MP однопоточен и для форматирования достаточно одного глобального массива.



Во-первых, неправильно говорить "массив на 200 ячеек", т.к. строки могут быть упакованными и в одну ячейку массива можно уместить целых 4 символа.
Во-вторых, в Pawn нет массивов с динамическим размером. Если объявить массив на 2000 ячеек, в нём будет (сюрприз!) 2000 ячеек, не больше и не меньше.

Да, я не форматирование имел в виду.А например такие функции как strcat,strins.

Видимо,я не совсем понимаю работу сервера.Если 100 игроков одновременно вызовут одну функцию,то она будет выполняться в определенной очереди для каждого игрока.А этих всех очередей мы не замечаем из-за быстрого выполнения операций?

Daniel_Cortez
20.02.2016, 13:48
Если 100 игроков одновременно вызовут одну функцию,то она будет выполняться в определенной очереди для каждого игрока.А этих всех очередей мы не замечаем из-за быстрого выполнения операций?
Можно и заметить, если писать говнокод, из-за которого будет виснуть сервер.