Форматирование строки
#1

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

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");
Это только пример, использую я это в других назначениях. Из-за такого переполняется стек, когда убираю - все в порядке. Есть ли какой-нибудь другой вариант использования? Заранее спасибо.
Reply
#2

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? Покажите реальный пример, что именно вы там делаете. А то трудно понять, что вам нужно.
Reply
#3

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

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);
Работает, но стек все же переполнен.
Reply
#5

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

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. Когда это убираю то нет никаких предупреждений по поводу переполнения стека.
Reply
#7

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");
Reply
#8

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

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

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");
Если взять во внимание всю простоту что я предложил ранее то это уже не нужно.
Reply
#10

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


Forum Jump:


Users browsing this thread: 1 Guest(s)