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



Рекурсии. - Pe3aK - 05.03.2014

Насколько я понимаю если она в стоках то это если название стока написано в retry то это бесконечный повтор. И так вопрос Может ли в этом быть проблема Рекурсии?

PHP код:
stock sendername(playerid)
{
new 
name[MAX_PLAYER_NAME];
GetPlayerName(playeridnamesizeof(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 != 
1test();
    return;

пример, мб у тебя где то похожее


Re: Рекурсии. - cm666 - 05.03.2014

Есть гдето прога которая показывает паблик в котором есть рекрусия

https://github.com/ATrigger/ruspawncc


Re: Рекурсии. - Eims - 06.03.2014

Для начала проверь паблик OnPlayerCommandText. Если в нём есть вызов команды по принципу:
PHP код:
public OnPlayerCommandText(playeridcmdtext[])
{
    if(!
strcmp("/команда_1"cmdtexttrue10))
    {
        
OnPlayerCommandText(playerid"/команда_2");
        return 
1;
    }
    if(!
strcmp("/команда_2"cmdtexttrue10))
    {
        print(
"lol");
        return 
1;
    }
    return 
0;

то дело именно в вызове OnPlayerCommandText внутри OnPlayerCommandText. Но эта рекурсия не опасна, ибо она подконтрольна (есть определённые условия, при которых паблик вызовет сам себя: если игрок ввёл "/команда_1", вызовется "/команда_2" и на этом действие прервётся, ибо имеется return + условие на cmdtext). Это самый распространённый случай, когда люди качают чужой мод и потом разводят панику.
Ну а если такого нет, отключай по очереди каждый паблик (комментируй его с помощью "/**/") и компилируй. Когда компилятор найдёт максимальный размер стэка, тогда и поймёшь, в каком паблике именно была рекурсия (какой закомментирован, в том и проблема). Ну дальше изучай более подробно паблик и ищи код, вызывающий рекурсию.
P.S. И начать комментировать стоит с инклюдов (не с a_samp, а с других), ибо часто в них так же бывает проблема.
Ну или же используй утилиту, о которой сказали выше.

И подобный способ вызывать ник игрока убог :с


- Pe3aK - 06.03.2014

с помощью утилиты нашёл. Теперь будьте ли вы добры хорошие люди. не подскажите где она именно?

Сказало мне что паблик называеться SetHealts

PHP код:
stock SetHealth(playeridFloatHeal)
{
    
Health2[playerid] = Heal;
    
PlayerInfo[playerid][pHeal] = Heal;
    
SetPlayerHealth(playeridHeal);
    if(
Heal 100.0SetHealth(playerid100.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(playeridFloatHeal)
{
    
Health2[playerid] = Heal;
    
PlayerInfo[playerid][pHeal] = Heal;
    
SetPlayerHealth(playeridHeal);
    if(
Heal 100.0SetHealth(playerid100.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.0SetHealth(playerid100.0); 
тут, если хп больше 100, он снова и снова будет вызывать функцию


Re: Рекурсии. - Stepashka - 06.03.2014

Quote:
Originally Posted by Reim
Посмотреть сообщение
PHP код:
if(Heal 100.0SetHealth(playerid100.0); 
тут, если хп больше 100, он снова и снова будет вызывать функцию
один раз он это вызовет, второй раз условие "100.0 > 100.0" вернет лож.