Рекурсии.
#1

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

PHP код:
stock sendername(playerid)
{
new 
name[MAX_PLAYER_NAME];
GetPlayerName(playeridnamesizeof(name));
return 
name;

Reply
#2

Нет.
Reply
#3

А как можно в моде легко её найти? Уже весь мод перерыл нечего не могу найти. но она там есть
Reply
#4

PHP код:
stock test()
{
    new var = 
1;
    if(var != 
1test();
    return;

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

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

https://github.com/ATrigger/ruspawncc
Reply
#6

Для начала проверь паблик 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, а с других), ибо часто в них так же бывает проблема.
Ну или же используй утилиту, о которой сказали выше.

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

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

Сказало мне что паблик называеться 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;

оно или искать дальше?
Reply
#8

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?
Reply
#9

PHP код:
if(Heal 100.0SetHealth(playerid100.0); 
тут, если хп больше 100, он снова и снова будет вызывать функцию
Reply
#10

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


Forum Jump:


Users browsing this thread: 1 Guest(s)