SA-MP Forums Archive
format - Printable Version

+- SA-MP Forums Archive (https://sampforum.blast.hk)
+-- Forum: Non-English (https://sampforum.blast.hk/forumdisplay.php?fid=9)
+--- Forum: Languages (https://sampforum.blast.hk/forumdisplay.php?fid=33)
+---- Forum: Русский/Russian (https://sampforum.blast.hk/forumdisplay.php?fid=32)
+---- Thread: format (/showthread.php?tid=604078)



format - themakar - 31.03.2016

Столкнулся с такой проблемой что...

Есть конструкция кода:

PHP код:
SendServerMessage(playerid"%s"Get_Language_Text(LANG_WELCOME), Get_Player_Name(playerid)); 
Get_Language_Text(LANG_WELCOME) содержит в себе "%s, добро пожаловать на SERVERNAME!".
Get_Player_Name(playerid) - Ник игрока.

И выводиться конечно же только ", добро пожаловать на SERVERNAME!", вот меня и интересует как можно сделать так, чтобы формат работал как я хотел.

Да можно сделать и вот так:
PHP код:
SendServerMessage(playerid"%s%s"Get_Player_Name(playerid), Get_Language_Text(LANG_WELCOME)); 
Ну, а если у меня формат в середине предложения?

Конструкция Get_Language_Text
PHP код:
enum {
    
LANG_WELCOME
};
new 
gLanguageData[][] = {
    
"%s, добро пожаловать на SERVERNAME!"
};
Get_Language_Text(textid)
{
    new 
        
string[256];
    
    
format(stringsizeof(string), gLanguageData[textid]);
    
    return 
string;




Re: format - Stepashka - 31.03.2016

pawn Код:
SendServerMessage(playerid, gLanguageData[LANG_WELCOME], Get_Player_Name(playerid));



Re: format - themakar - 31.03.2016

Quote:
Originally Posted by Stepashka
Посмотреть сообщение
pawn Код:
SendServerMessage(playerid, gLanguageData[LANG_WELCOME], Get_Player_Name(playerid));
Компилятор вылетает с ошибками

PHP код:
Pawn compiler 3.2.3664                  Copyright (c1997-2006ITB CompuPhase
modules
\system_player.p(30) : error 001expected token"-string end-"but fou
nd 
"-identifier-"
modules\system_player.p(30) : warning 215expression has no effect
modules
\system_player.p(30) : error 001expected token";"but found ")"
modules\system_player.p(30) : error 029invalid expressionassumed zero
modules
\system_player.p(30) : fatal error 107too many error messages on one li
ne
Compilation aborted
.
4 Errors
Причина всему наверно все таки сама функция SendServerMessage и придется отказаться от красоты кода и использовать нативные функции.

Функция SendServerMessage = SendClientMessageEx
PHP код:
SendClientMessageEx(playeridcolor, const text[], {Float_}:...)
{
    static
        
args,
        
str[144];
    if ((
args numargs()) == 3)
    {
        
SendClientMessage(playeridcolortext);
    }
    else
    {
        while (--
args >= 3)
        {
            
#emit LCTRL 5
            #emit LOAD.alt args
            #emit SHL.C.alt 2
            #emit ADD.C 12
            #emit ADD
            #emit LOAD.I
            #emit PUSH.pri
        
}
        
#emit PUSH.S text
        #emit PUSH.C 144
        #emit PUSH.C str
        #emit PUSH.S 8
        #emit SYSREQ.C format
        #emit LCTRL 5
        #emit SCTRL 4
        
SendClientMessage(playeridcolorstr);
        
#emit RETN
    
}
    return 
true;




Re: format - Stepashka - 31.03.2016

Ну ещё должно быть так:
pawn Код:
enum yourEnumName {
    LANG_WELCOME[40]
};

new gLanguageData[yourEnumName] = {
    "%s, добро пожаловать на SERVERNAME!"
};



Re: format - themakar - 31.03.2016

Quote:
Originally Posted by Stepashka
Посмотреть сообщение
Ну ещё должно быть так:
pawn Код:
enum yourEnumName {
    LANG_WELCOME[40]
};

new gLanguageData[yourEnumName] = {
    "%s, добро пожаловать на SERVERNAME!"
};
Почему ваш вариант лучше?

Для меня удобней делать так:

PHP код:
/* Используется как константы для обращения к ячейкам массива */
enum {
    
LANG_WELCOME
}; 
/* Не нужно каждый раз указывать размер строки. */
new gLanguageData[][] = {
    
"%s, добро пожаловать на SAMPLAY!"
}; 



Re: format - Stepashka - 31.03.2016

Quote:
Originally Posted by themakar
Посмотреть сообщение
Почему ваш вариант лучше?
Я не говорил что мой вариант лучше.
Вы используете enum не по назначению, и есть подозрение что ошибка у вас из-за этого. Попробуйте создать реальную константу, и использовать тот код что я писал ранее, есть подозрение что всё заработает.


Re: format - OKStyle - 31.03.2016

Quote:
Originally Posted by themakar
Посмотреть сообщение
Да можно сделать и вот так:
PHP код:
SendServerMessage(playerid"%s%s"Get_Player_Name(playerid), Get_Language_Text(LANG_WELCOME)); 
Ну, а если у меня формат в середине предложения?
А есть ли разница? Что говорят тесты?


Re: format - themakar - 31.03.2016

Вторая проблема, как совместить в одном формате два текста?

PHP код:
format(stringsizeof(string), Get_Language_Text(LANG_LOGIN_ATTEMP_ERROR), Get_Player_Login_Attempts(extraid), Get_Language_Text(LANG_DIALOG_LOGIN), Get_Player_Name(extraid));
ShowPlayerDialog(extraidDIALOG_LOGINDIALOG_STYLE_PASSWORDGet_Language_Text(LANG_DIALOG_LOGIN_HEADER), stringGet_Language_Text(LANG_DIALOG_ACCEPT), Get_Language_Text(LANG_DIALOG_CANCEL)); 
Допустим у меня вот есть две фразы в которые нужно передать параметры и я хочу все сделать это в одном формате, есть легкий вариант отформатировать сначала первую, потом вторую, а потом их вместе, чтобы соединить в одно целое.

PHP код:
enum {
    
LANG_DIALOG_ACCEPT,
    
LANG_DIALOG_CANCEL,
    
LANG_DIALOG_LOGIN_HEADER,
    
LANG_DIALOG_LOGIN,
    
LANG_LOGIN_ATTEMP_ERROR
};
new 
gLanguageData[][] = {
    
"{9cc254}Авторизация"
    
"{9cc254}%s{ffffff}, добро пожаловать на сервер {9cc254}servername{ffffff}!\n\nВаш аккаунт уже зарегистрирован на нашем проекте.\n\nДля авторизации на сервере, введите свой пароль в окошке:",
    
"{800000}* {ffffff}Указан неверный пароль, у вас осталось {800000}%d {ffffff}попыток.\n\n%s"
}; 



Re: format - OKStyle - 01.04.2016

Вот так, как ты написал - получается? В формате аргументы должны идти по очереди включения %#


Re: format - themakar - 01.04.2016

Quote:
Originally Posted by OKStyle
Посмотреть сообщение
Вот так, как ты написал - получается? В формате аргументы должны идти по очереди включения %#
Да вот так получается.

PHP код:
format(errorsizeof(error), Get_Language_Text(LANG_LOGIN_ATTEMP_ERROR), Get_Player_Login_Attempts(extraid));
format(stringsizeof(string), Get_Language_Text(LANG_DIALOG_LOGIN), Get_Player_Name(extraid));
                    
strcat(errorstring);
ShowPlayerDialog(extraidDIALOG_LOGINDIALOG_STYLE_PASSWORDGet_Language_Text(LANG_DIALOG_LOGIN_HEADER), errorGet_Language_Text(LANG_DIALOG_ACCEPT), Get_Language_Text(LANG_DIALOG_CANCEL));