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=314942)



Разница. - Xa0s - 01.02.2012

Подскажите в чем разница между:
1)
PHP код:
    static XaOs[MAX_PLAYERS];
    
и
    
new XaOs[MAX_PLAYERS]; 
2)
PHP код:
    stock XaOs(playerid, const string[])
    
и
    stock XaOs
(playeridstring[]) 



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 в некоторых ситуациях может оказаться очень выгодным решением.