Форматирование строки -
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])) ? ("Нету дома"));
Правда я не уверен, скомпилируется ли, из-за длины условия
|
не скомпелируется из-за опечатки