SA-MP Forums

Go Back   SA-MP Forums > Non-English > Languages > Русский/Russian

Reply
 
Thread Tools Display Modes
Old 16/04/2013, 06:04 PM   #1
CamperGTA
Big Clucker
 
Join Date: Jan 2013
Location: Россия
Posts: 188
Reputation: 0
Post Переполнение стека

Что такое переполнение стека?
Как его не допустить в моде/скрипте?
И покажите пример из-за чего может переполняться стек.
CamperGTA is offline   Reply With Quote
Old 16/04/2013, 06:29 PM   #2
Stepashka
Godfather
 
Stepashka's Avatar
 
Join Date: Jul 2008
Location: near PC
Posts: 5,763
Reputation: 142
Default Re: Переполнение стека

  1. Что такое переполнение стека?
    • Не создавать лишних переменных.
    • Экономно использовать память.
    • Писать аккуратный, оптимизированный код.
    • Не возвращать массивы.
  2. pawn Code:
    PlayerName(playerid){
        new name[MAX_PLAYER_NAME];
        GetPlayerName(playerid, name, sizeof(name));
        return name;
    }
__________________
Клятва Страуструпа: "Я обязуюсь прилежно комментировать свой код, не использовать goto и следить за состоянием своих потоков и выделяемой памяти. Я обязуюсь не оставлять мусора в системе и избегать однобуквенных переменных. Ресет." © Куч
M&M GM
Status: ON HOLD

Stepashka is online now   Reply With Quote
Old 16/04/2013, 06:42 PM   #3
CamperGTA
Big Clucker
 
Join Date: Jan 2013
Location: Россия
Posts: 188
Reputation: 0
Default Re: Переполнение стека

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

?
Какой вариант лучше?
CamperGTA is offline   Reply With Quote
Old 16/04/2013, 06:43 PM   #4
stabker
High-roller
 
Join Date: Mar 2012
Posts: 1,311
Reputation: 86
Default Re: Переполнение стека

Второй вариант лучше
stabker is offline   Reply With Quote
Old 16/04/2013, 06:44 PM   #5
XemyL
Huge Clucker
 
XemyL's Avatar
 
Join Date: Nov 2012
Posts: 342
Reputation: 3
Default Re: Переполнение стека

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

Last edited by XemyL; 17/04/2013 at 03:03 AM.
XemyL is offline   Reply With Quote
Old 17/04/2013, 05:01 AM   #6
Stepashka
Godfather
 
Stepashka's Avatar
 
Join Date: Jul 2008
Location: near PC
Posts: 5,763
Reputation: 142
Default Re: Переполнение стека

Quote:
Originally Posted by XemyL View Post
Небольшие массивы не переполнят стек же, если конечно разумно использовать и возвращать. Или объявлять их как глобальные.
Зависит от их количества. В официальной документации pawn четко сказано - массивы возвращать не рекомендуется, избегайте этого.
__________________
Клятва Страуструпа: "Я обязуюсь прилежно комментировать свой код, не использовать goto и следить за состоянием своих потоков и выделяемой памяти. Я обязуюсь не оставлять мусора в системе и избегать однобуквенных переменных. Ресет." © Куч
M&M GM
Status: ON HOLD

Stepashka is online now   Reply With Quote
Old 17/04/2013, 05:10 PM   #7
Frapsy
Big Clucker
 
Frapsy's Avatar
 
Join Date: Nov 2011
Location: Russia,Moscow
Posts: 92
Reputation: 0
Default Re: Переполнение стека

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

Так ведь проще
Frapsy is offline   Reply With Quote
Old 17/04/2013, 05:32 PM   #8
CamperGTA
Big Clucker
 
Join Date: Jan 2013
Location: Россия
Posts: 188
Reputation: 0
Default Re: Переполнение стека

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

Так ведь проще
Главное, чтобы не влияло на работу сервера, а не простота.
CamperGTA is offline   Reply With Quote
Old 17/04/2013, 06:06 PM   #9
eakwarp
High-roller
 
Join Date: Feb 2007
Posts: 1,912
Reputation: 131
Default Re: Переполнение стека

Quote:
Originally Posted by CamperGTA View Post
Главное, чтобы не влияло на работу сервера, а не простота.
Эм, если объективно, любой код влияет на работу сервера.
__________________
More than 10 years of development, more than 40 mb(sic! 1 kk lines+) of source code, more than a two hundred units and more than 35k revisions(upd. aug 2017). Valakas Roleplay - choose your role.

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



[Gamemode] Valakas Trucker Roleplay (Russian).
eakwarp is offline   Reply With Quote
Old 17/04/2013, 06:17 PM   #10
Alexander_Petrov
Gangsta
 
Join Date: Oct 2011
Location: Russia
Posts: 835
Reputation: 22
Default Re: Переполнение стека

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

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off



All times are GMT. The time now is 10:33 AM.


Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.