Переполнение стека
#1

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

  1. Что такое переполнение стека?
    • Не создавать лишних переменных.
    • Экономно использовать память.
    • Писать аккуратный, оптимизированный код.
    • Не возвращать массивы.
  2. pawn Code:
    PlayerName(playerid){
        new name[MAX_PLAYER_NAME];
        GetPlayerName(playerid, name, sizeof(name));
        return name;
    }
Reply
#3

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);

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

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

Quote:
Originally Posted by Stepashka
View Post
[*]Не возвращать массивы.
pawn Code:
PlayerName(playerid){
    new name[MAX_PLAYER_NAME];
    GetPlayerName(playerid, name, sizeof(name));
    return name;
}
Небольшие массивы не переполнят стек же, если конечно разумно использовать и возвращать. Или объявлять их как глобальные.
Reply
#6

Quote:
Originally Posted by XemyL
View Post
Небольшие массивы не переполнят стек же, если конечно разумно использовать и возвращать. Или объявлять их как глобальные.
Зависит от их количества. В официальной документации pawn четко сказано - массивы возвращать не рекомендуется, избегайте этого.
Reply
#7

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);

Так ведь проще
Reply
#8

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);

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

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

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

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

pName[MAX_PLAYER_NAME]

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

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

?
Reply
#12

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

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

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

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

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

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

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

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

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

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

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


Forum Jump:


Users browsing this thread: 1 Guest(s)