Разница. -
Xa0s - 01.02.2012
Подскажите в чем разница между:
1)
PHP код:
static XaOs[MAX_PLAYERS];
и
new XaOs[MAX_PLAYERS];
2)
PHP код:
stock XaOs(playerid, const string[])
и
stock XaOs(playerid, string[])
Re: Разница. -
Stepashka - 01.02.2012
1)
static - инициализируется один раз и существует на протяжении всей работы сервера. Сохраняет значения переменных на протяжении всей работы. Использовать в качестве глобальных бессмысленно.
new - инициализирается при каждом вызове функции, колбека или мода.
2)
const - создает переменную, значение которой изменить нельзя.
http://habrahabr.ru/blogs/cpp/59558/ язык другой но суть одна.
Re: Разница. -
CaHbKo - 01.02.2012
Слыхал что static сохраняет значение в циклах.
pawn Код:
for(new i; i != 10; i++)
{
static variable;
if(i == 3) variable = 9999;
printf("variable: %d", variable);
}
После 3 цикла variable навсегда останется 9999.
Re: Разница. -
Stepashka - 01.02.2012
Никогда не надо использовать статик внутри циклов, сугубо только внутри функции или колбеков!
Re: Разница. -
CaHbKo - 01.02.2012
Quote:
Originally Posted by Stepashka
Никогда не надо использовать статик внутри циклов, сугубо только внутри функции или колбеков!
|
Обоснуй.
Re: Разница. -
xJester - 01.02.2012
CaHbKo, сам написал: пост #3
Re: Разница. -
Stepashka - 01.02.2012
Quote:
Originally Posted by CaHbKo
Обоснуй.
|
Да как два пальца:
static после иницализации существуют всегда, пока не отключишь серв, и вот ради какого-то цикла ты хочешь выделить в памяти сервера место, которое будет занято всегда, под массив для этого цикла?!
А теперь на пальцах:
Что рациональнее для цикла:
pawn Код:
for(new i, variable; i != 10; i++)
{
if(i == 3) variable = 9999;
printf("variable: %d", variable);
}
и твоя переменная после 3 итерации всегда будет 9999. И при этом место в памяти освободится после того как цикл прекратит свою работу.
Для чего нужен
static, на примере банального счетчика.
pawn Код:
public OnGameModeInit()
{
SetTimer("MyCount", 1000, 1);
return 1;
}
forwrad MyCount();
public MyCount()
{
static count = -1;
if (count == -1)
{
count = 10;
}
else
{
printf("MyCount: %d", count);
count--;
}
}
вот для того чтобы переменная существовала только внутри паблика, не вылазила в область видимости глобальных переменных, но при этом и не обнулялась при каждом вызове паблика и существует
static.
Re: Разница. -
Norck - 01.02.2012
Quote:
Originally Posted by Stepashka
1) static - инициализируется один раз и существует на протяжении всей работы сервера. Сохраняет значения переменных на протяжении всей работы. Использовать в качестве глобальных бессмысленно.
new - инициализирается при каждом вызове функции, колбека или мода.
2) const - создает переменную, значение которой изменить нельзя. http://habrahabr.ru/blogs/cpp/59558/ язык другой но суть одна.
|
Поправочка: если объявить глобальную переменную с ключевым словом static - это ограничит её видимость файлом, в котором она была объявлена. То есть в разных файлах мы можем иметь глобальные переменные с одним и тем же имеем. Так что смысл очень даже есть.
Re: Разница. -
Stepashka - 01.02.2012
Quote:
Originally Posted by Norck
Поправочка: если объявить глобальную переменную с ключевым словом static - это ограничит её видимость файлом, в котором она была объявлена. То есть в разных файлах мы можем иметь глобальные переменные с одним и тем же имеем. Так что смысл очень даже есть.
|
начнем с того что
Pawn это не
С... Я думаю вы поняли куда я клоню.
Re: Разница. -
Norck - 01.02.2012
Quote:
Originally Posted by Stepashka
начнем с того что Pawn это не С... Я думаю вы поняли куда я клоню.
|
Я не имею опыта работы с чистым си, поэтому не уверен, что понял правильно. Но объявление глобальных переменных как static в некоторых ситуациях может оказаться очень выгодным решением.