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



Переполнение стека - CamperGTA - 16.04.2013

Что такое переполнение стека?
Как его не допустить в моде/скрипте?
И покажите пример из-за чего может переполняться стек.


Re: Переполнение стека - Stepashka - 16.04.2013

  1. Что такое переполнение стека?
    • Не создавать лишних переменных.
    • Экономно использовать память.
    • Писать аккуратный, оптимизированный код.
    • Не возвращать массивы.
  2. 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(playeridnamesizeof(name));
    return 
name;

вместо этого лучше везде использовать
PHP Code:
new name[MAX_PLAYER_NAME];
    
GetPlayerName(playeridnamesizeof(name)); 
или
PHP Code:
new PlayerName[MAX_PLAYERS][MAX_PLAYER_NAME];
OnPlayerConnect(playerid)
{
    new 
name[MAX_PLAYER_NAME];
    
GetPlayerName(playeridnamesizeof(name));
    
strmid(PlayerName(playerid), name0strlen(name), MAX_PLAYER_NAME);

?
Какой вариант лучше?


Re: Переполнение стека - stabker - 16.04.2013

Второй вариант лучше


Re: Переполнение стека - XemyL - 16.04.2013

Quote:
Originally Posted by Stepashka
View Post
[*]Не возвращать массивы.
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
View Post
Небольшие массивы не переполнят стек же, если конечно разумно использовать и возвращать. Или объявлять их как глобальные.
Зависит от их количества. В официальной документации pawn четко сказано - массивы возвращать не рекомендуется, избегайте этого.


Re: Переполнение стека - Frapsy - 17.04.2013

Quote:
Originally Posted by CamperGTA
View Post
PHP Code:
new PlayerName[MAX_PLAYERS][MAX_PLAYER_NAME];
OnPlayerConnect(playerid)
{
    new 
name[MAX_PLAYER_NAME];
    
GetPlayerName(playeridnamesizeof(name));
    
strmid(PlayerName(playerid), name0strlen(name), MAX_PLAYER_NAME);

PHP Code:
new PlayerName[MAX_PLAYERS][MAX_PLAYER_NAME];
public 
OnPlayerConnect(playerid) {
    
GetPlayerName(playeridPlayerName[playerid],MAX_PLAYER_NAME);

Так ведь проще


Re: Переполнение стека - CamperGTA - 17.04.2013

Quote:
Originally Posted by Frapsy
View Post
PHP Code:
new PlayerName[MAX_PLAYERS][MAX_PLAYER_NAME];
public 
OnPlayerConnect(playerid) {
    
GetPlayerName(playeridPlayerName[playerid],MAX_PLAYER_NAME);

Так ведь проще
Главное, чтобы не влияло на работу сервера, а не простота.


Re: Переполнение стека - eakwarp - 17.04.2013

Quote:
Originally Posted by CamperGTA
View Post
Главное, чтобы не влияло на работу сервера, а не простота.
Эм, если объективно, любой код влияет на работу сервера.


Re: Переполнение стека - Alexander_Petrov - 17.04.2013

Quote:
Originally Posted by CamperGTA
View Post
Главное, чтобы не влияло на работу сервера, а не простота.
Так оно как раз и не влияет.


Re: Переполнение стека - vampir9763 - 23.04.2013

а не проще ли в массив переменных игрока добавить переменную
Quote:

pName[MAX_PLAYER_NAME]

и при конекте игрока делать
Quote:

GetPlayerName(playerid,PlayerInfo[playerid][pName],MAX_PLAYER_NAME);

?


Re: Переполнение стека - AirKite - 23.04.2013

Quote:
Originally Posted by vampir9763
View Post
а не проще ли в массив переменных игрока добавить переменную и при конекте игрока делать ?
Читайте тему полностью. До вас уже поступало подобное предложение.


Re: Переполнение стека - NameNone - 26.04.2013

Quote:
Originally Posted by Ted67
View Post
В стек входят ТОЛЬКО локальные переменные и аргументы функций?
Да..


Re: Переполнение стека - Ted67 - 26.04.2013

Quote:
Originally Posted by NameNone
View Post
Да..
Просто переменных у меня не так уж и много, да и функций, а компилятор жалуется.. что стек переполнен...


Re: Переполнение стека - Johhny bravo - 26.04.2013

А глобальные тогда куда?


Re: Переполнение стека - Stepashka - 26.04.2013

Quote:
Originally Posted by Johhny bravo
View Post
А глобальные тогда куда?
"лежат" в памяти.


Re: Переполнение стека - NameNone - 26.04.2013

Quote:
Originally Posted by Ted67
View Post
В стек входят ТОЛЬКО локальные переменные и аргументы функций?
Quote:
Originally Posted by Ted67
View Post
Просто переменных у меня не так уж и много, да и функций, а компилятор жалуется.. что стек переполнен...
Размер стека можно увеличить, чего некоторые здесь не рекомендуют, включая документацию по pawn.
В стек идут те переменные, которые объявлены в теле подпрограммы. После её завершения - они удаляются из стека.

Я просто думаю, что у тебя в какой нибудь ветке кода, просто слишком много "тяжелых" переменных. Либо есть операции которые возвращают слишком тяжелый массив.

Если в чем то ошибаюсь, готов почитать поправки.


Re: Переполнение стека - -Stranger- - 30.04.2013

По стандарту размер 4096 ?


Re: Переполнение стека - White_116 - 30.04.2013

угу, в гайде так написано.


Re: Переполнение стека - eakwarp - 01.05.2013

Я просто вынужден повторится. То, что код вышел за пределы стандартного стека(4096), это не значит, что он не оптимизирован, это просто значит, что стек нужно увеличить. Хватит искать проблему там, где ее нет.