Переполнение стека -
CamperGTA - 16.04.2013
Что такое переполнение стека?
Как его не допустить в моде/скрипте?
И покажите пример из-за чего может переполняться стек.
Re: Переполнение стека -
Stepashka - 16.04.2013
- Что такое переполнение стека?
- Не создавать лишних переменных.
- Экономно использовать память.
- Писать аккуратный, оптимизированный код.
- Не возвращать массивы.
pawn Code:
PlayerName(playerid){
new name[MAX_PLAYER_NAME];
GetPlayerName(playerid, name, sizeof(name));
return name;
}
Re: Переполнение стека -
CamperGTA - 16.04.2013
PHP Code:
PlayerName(playerid){
new name[MAX_PLAYER_NAME];
GetPlayerName(playerid, name, sizeof(name));
return name;
}
вместо этого лучше везде использовать
PHP Code:
new name[MAX_PLAYER_NAME];
GetPlayerName(playerid, name, sizeof(name));
или
PHP Code:
new PlayerName[MAX_PLAYERS][MAX_PLAYER_NAME];
OnPlayerConnect(playerid)
{
new name[MAX_PLAYER_NAME];
GetPlayerName(playerid, name, sizeof(name));
strmid(PlayerName(playerid), name, 0, strlen(name), MAX_PLAYER_NAME);
}
?
Какой вариант лучше?
Re: Переполнение стека -
stabker - 16.04.2013
Второй вариант лучше
Re: Переполнение стека -
XemyL - 16.04.2013
Quote:
Originally Posted by Stepashka
[*]Не возвращать массивы.
pawn Code:
PlayerName(playerid){ new name[MAX_PLAYER_NAME]; GetPlayerName(playerid, name, sizeof(name)); return name; }
|
Небольшие массивы не переполнят стек же, если конечно разумно использовать и возвращать. Или объявлять их как глобальные.
Re: Переполнение стека -
Stepashka - 17.04.2013
Quote:
Originally Posted by XemyL
Небольшие массивы не переполнят стек же, если конечно разумно использовать и возвращать. Или объявлять их как глобальные.
|
Зависит от их количества. В официальной документации pawn четко сказано - массивы возвращать не рекомендуется, избегайте этого.
Re: Переполнение стека -
Frapsy - 17.04.2013
Quote:
Originally Posted by CamperGTA
PHP Code:
new PlayerName[MAX_PLAYERS][MAX_PLAYER_NAME];
OnPlayerConnect(playerid)
{
new name[MAX_PLAYER_NAME];
GetPlayerName(playerid, name, sizeof(name));
strmid(PlayerName(playerid), name, 0, strlen(name), MAX_PLAYER_NAME);
}
|
PHP Code:
new PlayerName[MAX_PLAYERS][MAX_PLAYER_NAME];
public OnPlayerConnect(playerid) {
GetPlayerName(playerid, PlayerName[playerid],MAX_PLAYER_NAME);
}
Так ведь проще
Re: Переполнение стека -
CamperGTA - 17.04.2013
Quote:
Originally Posted by Frapsy
PHP Code:
new PlayerName[MAX_PLAYERS][MAX_PLAYER_NAME];
public OnPlayerConnect(playerid) {
GetPlayerName(playerid, PlayerName[playerid],MAX_PLAYER_NAME);
}
Так ведь проще
|
Главное, чтобы не влияло на работу сервера, а не простота.
Re: Переполнение стека -
eakwarp - 17.04.2013
Quote:
Originally Posted by CamperGTA
Главное, чтобы не влияло на работу сервера, а не простота.
|
Эм, если объективно, любой код влияет на работу сервера.
Re: Переполнение стека -
Alexander_Petrov - 17.04.2013
Quote:
Originally Posted by CamperGTA
Главное, чтобы не влияло на работу сервера, а не простота.
|
Так оно как раз и не влияет.
Re: Переполнение стека -
vampir9763 - 23.04.2013
а не проще ли в массив переменных игрока добавить переменную
и при конекте игрока делать
Quote:
GetPlayerName(playerid,PlayerInfo[playerid][pName],MAX_PLAYER_NAME);
|
?
Re: Переполнение стека -
AirKite - 23.04.2013
Quote:
Originally Posted by vampir9763
а не проще ли в массив переменных игрока добавить переменную и при конекте игрока делать ?
|
Читайте тему полностью. До вас уже поступало подобное предложение.
Re: Переполнение стека -
NameNone - 26.04.2013
Quote:
Originally Posted by Ted67
В стек входят ТОЛЬКО локальные переменные и аргументы функций?
|
Да..
Re: Переполнение стека -
Ted67 - 26.04.2013
Quote:
Originally Posted by NameNone
Да..
|
Просто переменных у меня не так уж и много, да и функций, а компилятор жалуется.. что стек переполнен...
Re: Переполнение стека -
Johhny bravo - 26.04.2013
А глобальные тогда куда?
Re: Переполнение стека -
Stepashka - 26.04.2013
Quote:
Originally Posted by Johhny bravo
А глобальные тогда куда?
|
"лежат" в памяти.
Re: Переполнение стека -
NameNone - 26.04.2013
Quote:
Originally Posted by Ted67
В стек входят ТОЛЬКО локальные переменные и аргументы функций?
|
Quote:
Originally Posted by Ted67
Просто переменных у меня не так уж и много, да и функций, а компилятор жалуется.. что стек переполнен...
|
Размер стека можно увеличить, чего некоторые здесь не рекомендуют, включая документацию по pawn.
В стек идут те переменные, которые объявлены в теле подпрограммы. После её завершения - они удаляются из стека.
Я просто думаю, что у тебя в какой нибудь ветке кода, просто слишком много "тяжелых" переменных. Либо есть операции которые возвращают слишком тяжелый массив.
Если в чем то ошибаюсь, готов почитать поправки.
Re: Переполнение стека -
-Stranger- - 30.04.2013
По стандарту размер 4096 ?
Re: Переполнение стека -
White_116 - 30.04.2013
угу, в гайде так написано.
Re: Переполнение стека -
eakwarp - 01.05.2013
Я просто вынужден повторится. То, что код вышел за пределы стандартного стека(4096), это не значит, что он не оптимизирован, это просто значит, что стек нужно увеличить. Хватит искать проблему там, где ее нет.