SA-MP Forums Archive
Форматирование строки - 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: Форматирование строки (/showthread.php?tid=430563)



Форматирование строки - Ted67 - 14.04.2013

Здравствуйте, есть ли более оптимальный вариант чем этот?:

pawn Код:
new t1[10],t2[32];
if(Player[p][pTest]==1)t1="Number1";else t1="None";
if(Player[p][pTest2]==5)t2="У игрока pTest2 равна пяти."; else t2="У игрока pTest2 не равна пяти.";
format(str,100,"Пункт 1: %s\nПункт 2: %s",t1[0],t2[0]);
ShowPlayerDialog(p,321,DIALOG_STYLE_LIST,"Title",str,"Okay","Cancel");
Это только пример, использую я это в других назначениях. Из-за такого переполняется стек, когда убираю - все в порядке. Есть ли какой-нибудь другой вариант использования? Заранее спасибо.


Re: Форматирование строки - stabker - 14.04.2013

Quote:
Originally Posted by Ted67
Посмотреть сообщение
Здравствуйте, есть ли более оптимальный вариант чем этот?:

pawn Код:
new t1[10],t2[32];
if(Player[p][pTest]==1)t1="Number1";else t1="None";
if(Player[p][pTest2]==5)t2="У игрока pTest2 равна пяти."; else t2="У игрока pTest2 не равна пяти.";
format(str,100,"Пункт 1: %s\nПункт 2: %s",t1[0],t2[0]);
ShowPlayerDialog(p,321,DIALOG_STYLE_LIST,"Title",str,"Okay","Cancel");
Это только пример, использую я это в других назначениях. Из-за такого переполняется стек, когда убираю - все в порядке. Есть ли какой-нибудь другой вариант использования? Заранее спасибо.
Что мешает делать это все внутри format? Покажите реальный пример, что именно вы там делаете. А то трудно понять, что вам нужно.


Re: Форматирование строки - x_O - 14.04.2013

замени это:
pawn Код:
format(str,100,"Пункт 1: %s\nПункт 2: %s",t1[0],t2[0]);
на это:
pawn Код:
format(str,100,"Пункт 1: %s\nПункт 2: %s",t1,t2);



Re: Форматирование строки - Ted67 - 14.04.2013

Quote:
Originally Posted by stabker
Посмотреть сообщение
Что мешает делать это все внутри format? Покажите реальный пример, что именно вы там делаете. А то трудно понять, что вам нужно.
Например мне нужно вывести есть ли у игрока дом или нет:
pawn Код:
new dom[5];
if(Player[p][pHouse]!=0)dom="Есть";else dom="Нету";
format(str,32,"Дом: %s",dom);
ShowPlayerDialog(p,321,DIALOG_STYLE_LIST,"Title",str,"Ok","Cancel");
Quote:
Originally Posted by x_O
Посмотреть сообщение
замени это:
pawn Код:
format(str,100,"Пункт 1: %s\nПункт 2: %s",t1[0],t2[0]);
на это:
pawn Код:
format(str,100,"Пункт 1: %s\nПункт 2: %s",t1,t2);
Работает, но стек все же переполнен.


Re: Форматирование строки - stabker - 14.04.2013

pawn Код:
format(string, sizeof string, "Дом: %s", (Player[p][pHouse] != 0) ? ("Есть") : ("Нету"));
Можно и через strcat/strmid еще


Re: Форматирование строки - Ted67 - 14.04.2013

Quote:
Originally Posted by stabker
Посмотреть сообщение
pawn Код:
format(string, sizeof string, "Дом: %s", (Player[p][pHouse] != 0) ? ("Есть") : ("Нету"));
Можно и через strcat/strmid еще
Спасибо, но видимо проблема не в этом -_-. Использовал следующее:

pawn Код:
stock GetPlayerAdress(p)
{
    new id;
    if(Player[p][pHouse]!=0)id=Player[p][pHouse];
    if(Player[p][pRentHouse]!=0)id=Player[p][pRentHouse];
    new test[32];
    if(id==0)
    {
        test="Нету дома";
        return test;
    }
    strmid(test,House[id][hAdress],0,32,32);
    return test;
}
// и потом уже:
format(str,32,"Дом: %s",GetPlayerAdress(p));
ShowPlayerDialog(p,321,DIALOG_STYLE_LIST,"Title",str,"Ok","Cancel");
С этим что можно сделать?

p.s. Когда это убираю то нет никаких предупреждений по поводу переполнения стека.


Re: Форматирование строки - ZiGGi - 14.04.2013

Quote:
Originally Posted by Ted67
Посмотреть сообщение
Спасибо, но видимо проблема не в этом -_-. Использовал следующее:

pawn Код:
stock GetPlayerAdress(p)
{
    new id;
    if(Player[p][pHouse]!=0)id=Player[p][pHouse];
    if(Player[p][pRentHouse]!=0)id=Player[p][pRentHouse];
    new test[32];
    if(id==0)
    {
        test="Нету дома";
        return test;
    }
    strmid(test,House[id][hAdress],0,32,32);
    return test;
}
// и потом уже:
format(str,32,"Дом: %s",GetPlayerAdress(p));
ShowPlayerDialog(p,321,DIALOG_STYLE_LIST,"Title",str,"Ok","Cancel");
С этим что можно сделать?

p.s. Когда это убираю то нет никаких предупреждений по поводу переполнения стека.
Не возвращать массив.
pawn Код:
stock GetPlayerAdress(p, result[32])
{
    new id = 0;
    if (Player[p][pHouse] != 0) {
        id = Player[p][pHouse];
    }
    if (Player[p][pRentHouse] != 0) {
        id = Player[p][pRentHouse];
    }
   
    if (id == 0) {
        strmid(result, "Нету дома", 0, 32, 32);
    } else {
        strmid(result, House[id][hAdress], 0, 32, 32);
    }
}

GetPlayerAdress(p, str);
format(str, 32, "Дом: %s", str);
ShowPlayerDialog(p, 321, DIALOG_STYLE_LIST, "Title", str, "Ok", "Cancel");



Re: Форматирование строки - stabker - 14.04.2013

Не обязательно создавать сток для такой простой функции. Пример простой реализации:

pawn Код:
format(str, sizeof str,"Дом: %s", (Player[playerid][pHouse] != 0 || Player[playerid][pRentHouse] != 0) ? ((Player[playerid][pHouse] != 0) ? (House[Player[playerid][pHouse]][hAdress]) : (House[Player[playerid][pRentHouse]][hAdress])) ? ("Нету дома"));
Правда я не уверен, скомпилируется ли, из-за длины условия


Re: Форматирование строки - Stepashka - 14.04.2013

Quote:
Originally Posted by Ted67
Посмотреть сообщение
Например мне нужно вывести есть ли у игрока дом или нет:
pawn Код:
new dom[5];
if(Player[p][pHouse]!=0)dom="Есть";else dom="Нету";
format(str,32,"Дом: %s",dom);
ShowPlayerDialog(p,321,DIALOG_STYLE_LIST,"Title",str,"Ok","Cancel");
Все гораздо проще:
pawn Код:
ShowPlayerDialog(p, 321, DIALOG_STYLE_LIST, "Title", (Player[p][pHouse] != 0 ? "Есть дом" : "Нету дома"), "Ok", "Cancel");
Quote:
Originally Posted by Ted67
Посмотреть сообщение
Работает, но стек все же переполнен.
значит ошибка не здесь, а стек уже давно забит.


Quote:
Originally Posted by Ted67
Посмотреть сообщение
Спасибо, но видимо проблема не в этом -_-. Использовал следующее:

pawn Код:
stock GetPlayerAdress(p)
{
    new id;
    if(Player[p][pHouse]!=0)id=Player[p][pHouse];
    if(Player[p][pRentHouse]!=0)id=Player[p][pRentHouse];
    new test[32];
    if(id==0)
    {
        test="Нету дома";
        return test;
    }
    strmid(test,House[id][hAdress],0,32,32);
    return test;
}
// и потом уже:
format(str,32,"Дом: %s",GetPlayerAdress(p));
ShowPlayerDialog(p,321,DIALOG_STYLE_LIST,"Title",str,"Ok","Cancel");
С этим что можно сделать?

p.s. Когда это убираю то нет никаких предупреждений по поводу переполнения стека.
pawn Код:
GetPlayerAdress(playerid)//не надо создавать односимвольные переменные!!!
{
    new id;
    if (Player[playerid][pHouse] != 0) id=Player[playerid][pHouse];
    if (Player[playerid][pRentHouse] != 0) id=Player[playerid][pRentHouse]; //А если id уже не равно нулю то плевать что у меня есть дом?
    if (id) return House[id][hAdress]; //а ларчик то легко открывался
    else return "Нету дома"; //И даже ещё проще!
}
// и потом уже:
format(str,32,"Дом: %s",GetPlayerAdress(p));
ShowPlayerDialog(p,321,DIALOG_STYLE_LIST,"Title",str,"Ok","Cancel");
Если взять во внимание всю простоту что я предложил ранее то это уже не нужно.


Re: Форматирование строки - Stepashka - 14.04.2013

Quote:
Originally Posted by stabker
Посмотреть сообщение
Не обязательно создавать сток для такой простой функции. Пример простой реализации:

pawn Код:
format(str, sizeof str,"Дом: %s", (Player[playerid][pHouse] != 0 || Player[playerid][pRentHouse] != 0) ? ((Player[playerid][pHouse] != 0) ? (House[Player[playerid][pHouse]][hAdress]) : (House[Player[playerid][pRentHouse]][hAdress])) ? ("Нету дома"));
Правда я не уверен, скомпилируется ли, из-за длины условия
не скомпелируется из-за опечатки