Работа с аргументами.
#1

Хочу перевести stock с использованием y_va:
PHP Code:
stock Message_ToAdmins(color, const fmat[], va_args<>)
{
    foreach(new 
Player)
        if (
P[i][p_access] >= 1)
            
SendClientMessage(icolorva_return(fmatva_start<2>));

На функцию без лишних "зависимостей".
PHP Code:
stock Message_ToAdmins(color, const fmat[], {Float_}:...){
    foreach(new 
Player)
        if(
P[i][p_access] >= 1)
            
Lang_SendText(icolorfmat_);

Проблема в том что я не могу понять как выводить аргументы, количество которых нельзя определить заранее.
Reply
#2

Для получения значений аргументов есть такая функция: getarg
Reply
#3

Посмотри здесь:
http://forum.sa-mp.com/showpost.php?...&postcount=631
Reply
#4

Quote:
Originally Posted by Romz
View Post
Для получения значений аргументов есть такая функция: getarg
Quote:
Originally Posted by Diman777
View Post
Спасибо за подсказку!
Reply
#5

PHP Code:
main() {
    
SomeFunc(1"forum.sa-mp.com"37);

PHP Code:
SomeFunc(...)
{
    
printf("%s"getarg(1,0));

Выводит:
PHP Code:

Если 0 изменить на 1, уже будет показана буква u. Можно ли как-то автоматически считывать все буквы, без "ручного" метода? Не знаю как более правильно выразится.
Reply
#6

Как то так:
PHP Code:
exampleFunc("test");
stock exampleFunc({_}:...)
{
    new 
string[10];
    for(new 
0; ; i++)
    {
        if(
getarg(0i) == EOS)
            break;
        
string[i] = getarg(0i);
    }
    
printf("%s"string);

Reply
#7

Отсутствием "лишних" зависимостей ты не делаешь лучше Такой код будет довольно медленно работать даже относительно y_va (можно было бы догадаться, так как если бы было иначе, уже давно все пользовались бы такими самописными функциями и ****** не изобретал бы велосипед).
Уж если действительно хочешь избавиться от лишних зависимостей - прописывай напрямую format и SendClientMessage.
Reply
#8

y_va - это и есть лишняя зависимость)
Reply
#9

Quote:
Originally Posted by kennydalglish
View Post
Как то так:
PHP Code:
exampleFunc("test");
stock exampleFunc({_}:...)
{
    new 
string[10];
    for(new 
0; ; i++)
    {
        if(
getarg(0i) == EOS)
            break;
        
string[i] = getarg(0i);
    }
    
printf("%s"string);

Спасибо!

Quote:
Originally Posted by Eims
View Post
Отсутствием "лишних" зависимостей ты не делаешь лучше Такой код будет довольно медленно работать даже относительно y_va (можно было бы догадаться, так как если бы было иначе, уже давно все пользовались бы такими самописными функциями и ****** не изобретал бы велосипед).
Уж если действительно хочешь избавиться от лишних зависимостей - прописывай напрямую format и SendClientMessage.
Не хотелось бы использовать всю библиотеку YSI, так как она мне не нужна. Если получится запустить y_va отдельно - будет отлично.
Reply
#10

Удалось добится нужного эффекта используя дефолтные возможности 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 
Player){
        if(
P[i][p_access] >= 1){
            
Lang_GetText(Lang_GetPlayerLang(i), var, text);
            
Lang_format(textsizeof(text), textlang_start<1>);

            
SendClientMessage(i, -1text);
        }
    }

Reply
#11

Quote:
Originally Posted by Johhnyllll
View Post
Не хотелось бы использовать всю библиотеку YSI, так как она мне не нужна. Если получится запустить y_va отдельно - будет отлично.
Гораздо проще разобраться с функционалом YSI и найти ему применение, чем пользоваться велосипедами, которые ещё и выполняться будут в разы медленнее, чем и стандартный набор format+SendClientMessage, и y_va


Ну а если так уж боитесь лишних зависимостей, то, как уже писал, не ленитесь и пользуйтесь стандартным функционал. Тогда "лишних" зависимостей точно не будет.

Хотя, как показывает практика, нынче скриптеры считают "лишней зависимостью" ту библиотеку, в функционале которой до конца не разобрались и не понимают, что эта библиотека может в разы больше, чем они хотят от неё получить, соглашаясь терять в скорости и функционале ради каких-то своих надуманных причин, которые не создадут каких-либо проблем, в отличии альтернативных решений, выбранных ими.
Reply
#12

Quote:
Originally Posted by Johhnyllll
View Post
Удалось добится нужного эффекта используя дефолтные возможности 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 
Player){
        if(
P[i][p_access] >= 1){
            
Lang_GetText(Lang_GetPlayerLang(i), var, text);
            
Lang_format(textsizeof(text), textlang_start<1>);

            
SendClientMessage(i, -1text);
        }
    }

А зачем форматировать текст каждую итерацию? Не проще создать под каждый из языков массив, записать в эти массивы свой вариант текста и уже потом, в зависимости от выбранного языка, обращаться к нужному массиву? Это будет гораздо шустрее, чем то, что сделано сейчас.


И дабы не потерять гибкость кода (ну чтоб если решишь добавить новый язык, не пришлось потом вручную дописывать код во все подобные функции), достаточно просто создать перечисление, в котором уже будут указаны "массивы" для всех языков, привязанные к конкретным языкам. Ну и, соответственно, форматирование текста в функциях сделать через цикл, дабы любое изменение количества языков подхватывалось "на лету"
Reply
#13

Quote:
Originally Posted by Eims
View Post
А зачем форматировать текст каждую итерацию? Не проще создать под каждый из языков массив, записать в эти массивы свой вариант текста и уже потом, в зависимости от выбранного языка, обращаться к нужному массиву? Это будет гораздо шустрее, чем то, что сделано сейчас.


И дабы не потерять гибкость кода (ну чтоб если решишь добавить новый язык, не пришлось потом вручную дописывать код во все подобные функции), достаточно просто создать перечисление, в котором уже будут указаны "массивы" для всех языков, привязанные к конкретным языкам. Ну и, соответственно, форматирование текста в функциях сделать через цикл, дабы любое изменение количества языков подхватывалось "на лету"
Я не совсем понял что вы имеете ввиду.

В файлах которые использует zlang уже есть перевод нужной мне строки. В данном случае:
PHP Code:
// RU
MESSAGE_ADMIN_REPORT = {AA3333}Жалоба от %[ID:%d]:{ffffff} %s
// EN
MESSAGE_ADMIN_REPORT = {AA3333}Report from %[ID:%d]:{ffffff} %
Quote:

А зачем форматировать текст каждую итерацию?

Потому что язык который использует определённый человек может быть разным (т.е. не только русский), поэтому, в зависимости от его настроек, система и показывает ему нужную строку...если я правильно понял.
Reply
#14

Quote:
Originally Posted by Johhnyllll
View Post
Я не совсем понял что вы имеете ввиду.

В файлах которые использует zlang уже есть перевод нужной мне строки. В данном случае:
PHP Code:
// RU
MESSAGE_ADMIN_REPORT = {AA3333}Жалоба от %[ID:%d]:{ffffff} %s
// EN
MESSAGE_ADMIN_REPORT = {AA3333}Report from %[ID:%d]:{ffffff} %
Потому что язык который использует определённый человек может быть разным (т.е. не только русский), поэтому, в зависимости от его настроек, система и показывает ему нужную строку...если я правильно понял.
Форматируй столько, сколько языков.
Reply
#15

Quote:
Originally Posted by Johhnyllll
View Post
Я не совсем понял что вы имеете ввиду.

В файлах которые использует zlang уже есть перевод нужной мне строки. В данном случае:
PHP Code:
// RU
MESSAGE_ADMIN_REPORT = {AA3333}Жалоба от %[ID:%d]:{ffffff} %s
// EN
MESSAGE_ADMIN_REPORT = {AA3333}Report from %[ID:%d]:{ffffff} %
Потому что язык который использует определённый человек может быть разным (т.е. не только русский), поэтому, в зависимости от его настроек, система и показывает ему нужную строку...если я правильно понял.
Ну так тебе ведь заранее известны все возможные варианты языков. И вместо того, чтоб для каждого игрока форматировать строку по новой, можно один раз записать конкретную строку для всех языков, а потом уже обращаться к записанным вариантам.

Что-то типа

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 
iMAX_LANGi++)
    {
        
Lang_GetText(i, var, text[i]); // Выгружаем строку для каждого языка
        
Lang_format(text[i], MAX_LANG_MFORMAT_STRINGtext[i], lang_start<1>); // Форматируем строку
    
}


    foreach(new 
Player)
    { 
        if(
P[i][p_access] >= 1)
        {
            
SendClientMessage(i, -1text[Lang_GetPlayerLang(i)]);// Обращаемся к заранее отформатированной строке, а не форматируем её каждый раз по новой 
        
}
    }
    return 
1;

Только я бы ещё советовал создать итератор для "p_access", а не городить такие проверки, дабы свести вообще все лишние действия к минимуму.
Reply
#16

Quote:
Originally Posted by Eims
View Post
Ну так тебе ведь заранее известны все возможные варианты языков. И вместо того, чтоб для каждого игрока форматировать строку по новой, можно один раз записать конкретную строку для всех языков, а потом уже обращаться к записанным вариантам.

Что-то типа

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 
iMAX_LANGi++)
    {
        
Lang_GetText(i, var, text[i]); // Выгружаем строку для каждого языка
        
Lang_format(text[i], MAX_LANG_MFORMAT_STRINGtext[i], lang_start<1>); // Форматируем строку
    
}


    foreach(new 
Player)
    { 
        if(
P[i][p_access] >= 1)
        {
            
SendClientMessage(i, -1text[Lang_GetPlayerLang(i)]);// Обращаемся к заранее отформатированной строке, а не форматируем её каждый раз по новой 
        
}
    }
    return 
1;

Только я бы ещё советовал создать итератор для "p_access", а не городить такие проверки, дабы свести вообще все лишние действия к минимуму.
Хорошо, спасибо.
Reply
#17

Quote:
Originally Posted by kennydalglish
View Post
Как то так:
PHP Code:
exampleFunc("test");

stock exampleFunc({_}:...)
{
    new 
string[10];

    for(new 
0; ; i++)
    {
        if(
getarg(0i) == EOS)
            break;
        
string[i] = getarg(0i);
    }
    
printf("%s"string);

Круто, но код не работает

PHP Code:
stock
    SomeFunc
({Float_}:...)
{
    new
        
i,
        
j;

    static 
string[128];

    for (new 
argargs numargs(); arg argsarg++)
    {
        
0;
        while ((
string[j++] = getarg(argi++)) != \'\0\') {}
        print(string);
        
string[0] = EOS;
    }

ЕДИТ: это мой мозг не работает, но код оставлю
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)