PDA

Просмотр полной версии : [Вопрос] Ассемблерные вставки



Desulaid
25.04.2015, 09:46
Вот ASSEMBLER'ские вставки. Они работают хорошо или смотря как. Просто я вырезал код(см. спойлер) и как он поведет себя? Как я понял - это типа заменитель форматирования и сенди^^ (SendClientMessage)


stock SendMes(playerid, color, fstring[], {Float, _}:...)
{
static const
STATIC_ARGS = 3;
new
n = (numargs() - STATIC_ARGS) * BYTES_PER_CELL;
if (n)
{
new
message[128],
arg_start,
arg_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);

// Push the static format parameters.
#emit PUSH.S fstring
#emit PUSH.C 128
#emit PUSH.ADR message

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

n += BYTES_PER_CELL;
#emit LCTRL 4
#emit LOAD.S.alt n
#emit ADD
#emit SCTRL 4

return SendClientMessage(playerid, color, message);
}
else
{
return SendClientMessage(playerid, color, fstring);
}
}



SendMes(playerid, -1, "Твое имя - %s", pInfo[playerid][pName]);

Или лучше форматировать и сендить?

L0ndl3m
25.04.2015, 17:15
"форматировать и сендить" лучше.

Desulaid
25.04.2015, 20:39
"форматировать и сендить" лучше.

Я просто хотел их заменить на "незначительное форматирование", когда выдаю админ права.


CMD:makeadmin(playerid, params[])
{
if(pAdmin[playerid][aLevel] >= 5 || IsPlayerAdmin(playerid))
{
if(sscanf(params, "ud", params[0], params[1])) return SendClientMessage(playerid, -1, "Использование: /makeadmin [id] [уровень]");
if(params[1] > 7 || params[1] < 0) return SendClientMessage(playerid, 0xD3D3D3FF, "Уровень не должен быть больше 5 и меньше 0");
if(GetPVarInt(params[0], "Logged") == 0) return SendClientMessage(playerid, 0xD3D3D3FF, "Игрок не подключен");
pAdmin[playerid][aLevel] = params[1];
pAdmin[playerid][aPassword] = 1337+playerid-228*random(321);
pAdmin[playerid][aID] = 99999+random(999999)+playerid*2;
FormatMessage(playerid, -1, "{FFD700}Вы выдали {FFFFFF}%d {FFD700}уровень администрирования игроку {FFFFFF}%s", params[1], pInfo[params[0]][pName]);
new sendername[MAX_PLAYER_NAME];
GetPlayerName(playerid, sendername, sizeof(sendername));
FormatMessage(params[0], -1, "{FFD700}Администратор {FFFFFF}%s {FFD700}выдал вам {FFFFFF}%d {FFD700}уровень администрирования", sendername, params[1]);
FormatMessage(params[0], -1, "{87CEFF}Ваш личный админ-пароль: {FFFFFF}%d", pAdmin[playerid][aPassword], params[1]);
}
return 1;
}

FormatMessage - есть есть та функция, которую я выкину в шапке поста, только название понятное для себя сделал. В этих случаях можно использовать вставки или лучше форматировать и сендить? :D

Daniel_Cortez
27.04.2015, 06:11
Как вам удобнее. Но никакой оптимизации от этой функции не будет (более того, обычная комбинация format+SCM работает быстрее).
Да и за стабильность функции вряд ли кто-то станет ручаться.

Desulaid
27.04.2015, 17:30
Как вам удобнее. Но никакой оптимизации от этой функции не будет (более того, обычная комбинация format+SCM работает быстрее).
Да и за стабильность функции вряд ли кто-то станет ручаться.

А если использовать вот к примеру такой код


new format_string[228];
#define FormatMessage(%0,%1,%2,%3) format(format_string, sizeof(format_string),%2,%3) && SendClientMessage(%0, %1, format_string)


Он же ничем не отличается от простого форматирования и отправления в чат?

Mazzilla
27.04.2015, 22:24
stock, не?

NewGreen
28.04.2015, 10:31
А если использовать вот к примеру такой код


new format_string[228];
#define FormatMessage(%0,%1,%2,%3) format(format_string, sizeof(format_string),%2,%3) && SendClientMessage(%0, %1, format_string)


Он же ничем не отличается от простого форматирования и отправления в чат?

#define - позволяет определять константы и макросы



// константа
#define BUFFER_SIZE ( 512 )

// макрос
#define FormatMessage(%0,%1,%2,%3) format(format_string, sizeof(format_string),%2,%3) && SendClientMessage(%0, %1, format_string)


В процессе компиляции, везде где в коде используется константа BUFFER_SIZE произойдет замена на 512,
также и с макросом FormatMessage(%0,%1,%2,%3), будет замена на format(format_string, sizeof(format_string),%2,%3) && SendClientMessage(%0, %1, format_string).
#define позволяет сэкономить время при написание рутинных операций.