Работа с аргументами. -
Johhnyllll - 13.08.2018
Хочу перевести stock с использованием
y_va:
PHP Code:
stock Message_ToAdmins(color, const fmat[], va_args<>)
{
foreach(new i : Player)
if (P[i][p_access] >= 1)
SendClientMessage(i, color, va_return(fmat, va_start<2>));
}
На функцию без лишних "зависимостей".
PHP Code:
stock Message_ToAdmins(color, const fmat[], {Float, _}:...){
foreach(new i : Player)
if(P[i][p_access] >= 1)
Lang_SendText(i, color, fmat, _);
}
Проблема в том что я не могу понять как выводить аргументы, количество которых нельзя определить заранее.
Re: Работа с аргументами. -
Romz - 13.08.2018
Для получения значений аргументов есть такая функция:
getarg
Re: Работа с аргументами. -
Diman777 - 13.08.2018
Посмотри здесь:
http://forum.sa-mp.com/showpost.php?...&postcount=631
Re: Работа с аргументами. -
Johhnyllll - 13.08.2018
Quote:
Originally Posted by Romz
Для получения значений аргументов есть такая функция: getarg
|
Quote:
Originally Posted by Diman777
|
Спасибо за подсказку!
Re: Работа с аргументами. -
Johhnyllll - 13.08.2018
PHP Code:
main() {
SomeFunc(1, "forum.sa-mp.com", 3, 7);
}
PHP Code:
SomeFunc(...)
{
printf("%s", getarg(1,0));
}
Выводит:
Если 0 изменить на 1, уже будет показана буква
u. Можно ли как-то автоматически считывать все буквы, без "ручного" метода? Не знаю как более правильно выразится.
Re: Работа с аргументами. -
kennydalglish - 14.08.2018
Как то так:
PHP Code:
exampleFunc("test");
stock exampleFunc({_}:...)
{
new string[10];
for(new i = 0; ; i++)
{
if(getarg(0, i) == EOS)
break;
string[i] = getarg(0, i);
}
printf("%s", string);
}
Re: Работа с аргументами. -
Eims - 14.08.2018
Отсутствием "лишних" зависимостей ты не делаешь лучше

Такой код будет довольно медленно работать даже относительно y_va
(можно было бы догадаться, так как если бы было иначе, уже давно все пользовались бы такими самописными функциями и ****** не изобретал бы велосипед).
Уж если действительно хочешь избавиться от лишних зависимостей - прописывай напрямую format и SendClientMessage.
Re: Работа с аргументами. -
OKStyle - 14.08.2018
y_va - это и есть лишняя зависимость)
Re: Работа с аргументами. -
Johhnyllll - 14.08.2018
Quote:
Originally Posted by kennydalglish
Как то так:
PHP Code:
exampleFunc("test");
stock exampleFunc({_}:...)
{
new string[10];
for(new i = 0; ; i++)
{
if(getarg(0, i) == EOS)
break;
string[i] = getarg(0, i);
}
printf("%s", string);
}
|
Спасибо!
Quote:
Originally Posted by Eims
Отсутствием "лишних" зависимостей ты не делаешь лучше  Такой код будет довольно медленно работать даже относительно y_va (можно было бы догадаться, так как если бы было иначе, уже давно все пользовались бы такими самописными функциями и ****** не изобретал бы велосипед).
Уж если действительно хочешь избавиться от лишних зависимостей - прописывай напрямую format и SendClientMessage.
|
Не хотелось бы использовать всю библиотеку YSI, так как она мне не нужна. Если получится запустить y_va отдельно - будет отлично.
Re: Работа с аргументами. -
Johhnyllll - 17.08.2018
Удалось добится нужного эффекта используя дефолтные возможности zlang.
PHP Code:
Message_ToAdmin("MESSAGE_ADMIN_REPORT",P[playerid][p_name],playerid,inputtext);
PHP Code:
stock Message_ToAdmin(var[], lang_args<>){
static
text[MAX_LANG_MFORMAT_STRING];
foreach(new i : Player){
if(P[i][p_access] >= 1){
Lang_GetText(Lang_GetPlayerLang(i), var, text);
Lang_format(text, sizeof(text), text, lang_start<1>);
SendClientMessage(i, -1, text);
}
}
}
Re: Работа с аргументами. -
Eims - 17.08.2018
Quote:
Originally Posted by Johhnyllll
Не хотелось бы использовать всю библиотеку YSI, так как она мне не нужна. Если получится запустить y_va отдельно - будет отлично.
|
Гораздо проще разобраться с функционалом YSI и найти ему применение, чем пользоваться велосипедами, которые ещё и выполняться будут в разы медленнее, чем и стандартный набор format+SendClientMessage, и y_va
Ну а если так уж боитесь лишних зависимостей, то, как уже писал, не ленитесь и пользуйтесь стандартным функционал. Тогда "лишних" зависимостей точно не будет.
Хотя, как показывает практика, нынче скриптеры считают "лишней зависимостью" ту библиотеку, в функционале которой до конца не разобрались и не понимают, что эта библиотека может в разы больше, чем они хотят от неё получить, соглашаясь терять в скорости и функционале ради каких-то своих надуманных причин, которые не создадут каких-либо проблем, в отличии альтернативных решений, выбранных ими.
Re: Работа с аргументами. -
Eims - 17.08.2018
Quote:
Originally Posted by Johhnyllll
Удалось добится нужного эффекта используя дефолтные возможности zlang.
PHP Code:
Message_ToAdmin("MESSAGE_ADMIN_REPORT",P[playerid][p_name],playerid,inputtext);
PHP Code:
stock Message_ToAdmin(var[], lang_args<>){ static text[MAX_LANG_MFORMAT_STRING]; foreach(new i : Player){ if(P[i][p_access] >= 1){ Lang_GetText(Lang_GetPlayerLang(i), var, text); Lang_format(text, sizeof(text), text, lang_start<1>); SendClientMessage(i, -1, text); } } }
|
А зачем форматировать текст каждую итерацию? Не проще создать под каждый из языков массив, записать в эти массивы свой вариант текста и уже потом, в зависимости от выбранного языка, обращаться к нужному массиву? Это будет гораздо шустрее, чем то, что сделано сейчас.
И дабы не потерять гибкость кода
(ну чтоб если решишь добавить новый язык, не пришлось потом вручную дописывать код во все подобные функции), достаточно просто создать перечисление, в котором уже будут указаны "массивы" для всех языков, привязанные к конкретным языкам. Ну и, соответственно, форматирование текста в функциях сделать через цикл, дабы любое изменение количества языков подхватывалось "на лету"
Re: Работа с аргументами. -
Johhnyllll - 17.08.2018
Quote:
Originally Posted by Eims
А зачем форматировать текст каждую итерацию? Не проще создать под каждый из языков массив, записать в эти массивы свой вариант текста и уже потом, в зависимости от выбранного языка, обращаться к нужному массиву? Это будет гораздо шустрее, чем то, что сделано сейчас.
И дабы не потерять гибкость кода (ну чтоб если решишь добавить новый язык, не пришлось потом вручную дописывать код во все подобные функции), достаточно просто создать перечисление, в котором уже будут указаны "массивы" для всех языков, привязанные к конкретным языкам. Ну и, соответственно, форматирование текста в функциях сделать через цикл, дабы любое изменение количества языков подхватывалось "на лету" 
|
Я не совсем понял что вы имеете ввиду.
В файлах которые использует zlang уже есть перевод нужной мне строки. В данном случае:
PHP Code:
// RU
MESSAGE_ADMIN_REPORT = {AA3333}Жалоба от %s [ID:%d]:{ffffff} %s
// EN
MESSAGE_ADMIN_REPORT = {AA3333}Report from %s [ID:%d]:{ffffff} %s
Quote:
А зачем форматировать текст каждую итерацию?
|
Потому что язык который использует определённый человек может быть разным (т.е. не только русский), поэтому, в зависимости от его настроек, система и показывает ему нужную строку...если я правильно понял.
Re: Работа с аргументами. -
White_116 - 17.08.2018
Quote:
Originally Posted by Johhnyllll
Я не совсем понял что вы имеете ввиду.
В файлах которые использует zlang уже есть перевод нужной мне строки. В данном случае:
PHP Code:
// RU MESSAGE_ADMIN_REPORT = {AA3333}Жалоба от %s [ID:%d]:{ffffff} %s // EN MESSAGE_ADMIN_REPORT = {AA3333}Report from %s [ID:%d]:{ffffff} %s
Потому что язык который использует определённый человек может быть разным (т.е. не только русский), поэтому, в зависимости от его настроек, система и показывает ему нужную строку...если я правильно понял.
|
Форматируй столько, сколько языков.
Re: Работа с аргументами. -
Eims - 18.08.2018
Quote:
Originally Posted by Johhnyllll
Я не совсем понял что вы имеете ввиду.
В файлах которые использует zlang уже есть перевод нужной мне строки. В данном случае:
PHP Code:
// RU MESSAGE_ADMIN_REPORT = {AA3333}Жалоба от %s [ID:%d]:{ffffff} %s // EN MESSAGE_ADMIN_REPORT = {AA3333}Report from %s [ID:%d]:{ffffff} %s
Потому что язык который использует определённый человек может быть разным (т.е. не только русский), поэтому, в зависимости от его настроек, система и показывает ему нужную строку...если я правильно понял.
|
Ну так тебе ведь заранее известны все возможные варианты языков. И вместо того, чтоб для каждого игрока форматировать строку по новой, можно один раз записать конкретную строку для всех языков, а потом уже обращаться к записанным вариантам.
Что-то типа
PHP Code:
enum _:e_ARRAYS_LANG_LIST
{
langRus[MAX_LANG_MFORMAT_STRING],
langEng[MAX_LANG_MFORMAT_STRING]
};
stock Message_ToAdmin(var[], lang_args<>)
{
static
text[e_ARRAYS_LANG_LIST];
for(new i; i < MAX_LANG; i++)
{
Lang_GetText(i, var, text[i]); // Выгружаем строку для каждого языка
Lang_format(text[i], MAX_LANG_MFORMAT_STRING, text[i], lang_start<1>); // Форматируем строку
}
foreach(new i : Player)
{
if(P[i][p_access] >= 1)
{
SendClientMessage(i, -1, text[Lang_GetPlayerLang(i)]);// Обращаемся к заранее отформатированной строке, а не форматируем её каждый раз по новой
}
}
return 1;
}
Только я бы ещё советовал создать итератор для "p_access", а не городить такие проверки, дабы свести вообще все лишние действия к минимуму.
Re: Работа с аргументами. -
Johhnyllll - 18.08.2018
Quote:
Originally Posted by Eims
Ну так тебе ведь заранее известны все возможные варианты языков. И вместо того, чтоб для каждого игрока форматировать строку по новой, можно один раз записать конкретную строку для всех языков, а потом уже обращаться к записанным вариантам.
Что-то типа
PHP Code:
enum _:e_ARRAYS_LANG_LIST { langRus[MAX_LANG_MFORMAT_STRING], langEng[MAX_LANG_MFORMAT_STRING] }; stock Message_ToAdmin(var[], lang_args<>) { static text[e_ARRAYS_LANG_LIST]; for(new i; i < MAX_LANG; i++) { Lang_GetText(i, var, text[i]); // Выгружаем строку для каждого языка Lang_format(text[i], MAX_LANG_MFORMAT_STRING, text[i], lang_start<1>); // Форматируем строку } foreach(new i : Player) { if(P[i][p_access] >= 1) { SendClientMessage(i, -1, text[Lang_GetPlayerLang(i)]);// Обращаемся к заранее отформатированной строке, а не форматируем её каждый раз по новой } } return 1; }
Только я бы ещё советовал создать итератор для "p_access", а не городить такие проверки, дабы свести вообще все лишние действия к минимуму.
|
Хорошо, спасибо.
Re: Работа с аргументами. -
desu - 21.08.2018
Quote:
Originally Posted by kennydalglish
Как то так:
PHP Code:
exampleFunc("test"); stock exampleFunc({_}:...) { new string[10]; for(new i = 0; ; i++) { if(getarg(0, i) == EOS) break; string[i] = getarg(0, i); } printf("%s", string); }
|
Круто, но код не работает
PHP Code:
stock
SomeFunc({Float, _}:...)
{
new
i,
j;
static string[128];
for (new arg, args = numargs(); arg < args; arg++)
{
i = 0;
while ((string[j++] = getarg(arg, i++)) != \'\0\') {}
print(string);
string[j = 0] = EOS;
}
}
ЕДИТ: это мой мозг не работает, но код оставлю