Рекурсии. -
Pe3aK - 05.03.2014
Насколько я понимаю если она в стоках то это если название стока написано в retry то это бесконечный повтор. И так вопрос Может ли в этом быть проблема Рекурсии?
PHP код:
stock sendername(playerid)
{
new name[MAX_PLAYER_NAME];
GetPlayerName(playerid, name, sizeof(name));
return name;
}
Re: Рекурсии. -
KriD - 05.03.2014
Нет.
-
Pe3aK - 05.03.2014
А как можно в моде легко её найти? Уже весь мод перерыл нечего не могу найти. но она там есть
Re: Рекурсии. -
Reim - 05.03.2014
PHP код:
stock test()
{
new var = 1;
if(var != 1) test();
return;
}
пример, мб у тебя где то похожее
Re: Рекурсии. -
cm666 - 05.03.2014
Есть гдето прога которая показывает паблик в котором есть рекрусия
https://github.com/ATrigger/ruspawncc
Re: Рекурсии. -
Eims - 06.03.2014
Для начала проверь паблик OnPlayerCommandText. Если в нём есть вызов команды по принципу:
PHP код:
public OnPlayerCommandText(playerid, cmdtext[])
{
if(!strcmp("/команда_1", cmdtext, true, 10))
{
OnPlayerCommandText(playerid, "/команда_2");
return 1;
}
if(!strcmp("/команда_2", cmdtext, true, 10))
{
print("lol");
return 1;
}
return 0;
}
то дело именно в вызове OnPlayerCommandText внутри OnPlayerCommandText. Но эта рекурсия не опасна, ибо она подконтрольна (есть определённые условия, при которых паблик вызовет сам себя: если игрок ввёл "/команда_1", вызовется "/команда_2" и на этом действие прервётся, ибо имеется return + условие на cmdtext). Это самый распространённый случай, когда люди качают чужой мод и потом разводят панику.
Ну а если такого нет, отключай по очереди каждый паблик (комментируй его с помощью "/**/") и компилируй. Когда компилятор найдёт максимальный размер стэка, тогда и поймёшь, в каком паблике именно была рекурсия (какой закомментирован, в том и проблема). Ну дальше изучай более подробно паблик и ищи код, вызывающий рекурсию.
P.S. И начать комментировать стоит с инклюдов (не с a_samp, а с других), ибо часто в них так же бывает проблема.
Ну или же используй утилиту, о которой сказали выше.
И подобный способ вызывать ник игрока убог :с
-
Pe3aK - 06.03.2014
с помощью утилиты нашёл. Теперь будьте ли вы добры хорошие люди. не подскажите где она именно?
Сказало мне что паблик называеться SetHealts
PHP код:
stock SetHealth(playerid, Float: Heal)
{
Health2[playerid] = Heal;
PlayerInfo[playerid][pHeal] = Heal;
SetPlayerHealth(playerid, Heal);
if(Heal > 100.0) SetHealth(playerid, 100.0);
//if(PlayerInfo[playerid][pHeal] > 100) {PlayerInfo[playerid][pHeal] = 100.0; SetPlayerHealth(playerid, 100.0);}
return true;
}
оно или искать дальше?
Re: Рекурсии. -
Stepashka - 06.03.2014
Quote:
Originally Posted by Pe3aK
с помощью утилиты нашёл. Теперь будьте ли вы добры хорошие люди. не подскажите где она именно?
Сказало мне что паблик называеться SetHealts
PHP код:
stock SetHealth(playerid, Float: Heal)
{
Health2[playerid] = Heal;
PlayerInfo[playerid][pHeal] = Heal;
SetPlayerHealth(playerid, Heal);
if(Heal > 100.0) SetHealth(playerid, 100.0);
//if(PlayerInfo[playerid][pHeal] > 100) {PlayerInfo[playerid][pHeal] = 100.0; SetPlayerHealth(playerid, 100.0);}
return true;
}
оно или искать дальше?
|
А дефайна нет который все
SetPlayerHealth "автоматически" заменяет на
SetHealth?
Re: Рекурсии. -
Reim - 06.03.2014
PHP код:
if(Heal > 100.0) SetHealth(playerid, 100.0);
тут, если хп больше 100, он снова и снова будет вызывать функцию
Re: Рекурсии. -
Stepashka - 06.03.2014
Quote:
Originally Posted by Reim
PHP код:
if(Heal > 100.0) SetHealth(playerid, 100.0);
тут, если хп больше 100, он снова и снова будет вызывать функцию
|
один раз он это вызовет, второй раз условие "100.0 > 100.0" вернет лож.