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

Pages: 1 2


Как найти рекурсию в моде ? - Mexanizm93 - 07.02.2013

Здравствуйте уважаемые пользователи.
Сегодня при дебаге мода обнаружил, что вы моде есть рекурсии.
Проискал их в моде в stock/public но не обнаружил.
Искал несколько раз. Возможно где то пропустил.

Code:
Stack/heap size:      16384 bytes; estimated max. usage: unknown, due to recursion
Подскажите как найти эту самую рекурсию и примеры рекурсий.
Знаю, лиш что во такой пример:

PHP Code:
stock ololo()
{
// olo2
return ololo();

Спасибо


Re: Как найти рекурсию в моде ? - eakwarp - 07.02.2013

В моде, просто превышен максимальный размер массива, используйте в начале мода:
#pragma dynamic требуемый_размер


Re: Как найти рекурсию в моде ? - Mexanizm93 - 07.02.2013

Не хотелось бы использовать pragma dynamic. Это обход а не само решения.
Подскажите пожалуйста максимальный размер массива и об этом как можно поодробней


Re: Как найти рекурсию в моде ? - eakwarp - 07.02.2013

Quote:
Originally Posted by Mexanizm93
View Post
Не хотелось бы использовать pragma dynamic. Это обход а не само решения.
Подскажите пожалуйста максимальный размер массива и об этом как можно поодробней
Это само решение. Суть в том, что вы изменяете вводные компилятора.


Re: Как найти рекурсию в моде ? - Mexanizm93 - 07.02.2013

Дело всё в том, что это сообщение компилятор выводит лиш при дебаге(с ключём -d2).
Без дебага же это сообщение не появляется


Re: Как найти рекурсию в моде ? - Alexander_Petrov - 07.02.2013

Quote:
Originally Posted by Mexanizm93
View Post
Дело всё в том, что это сообщение компилятор выводит лиш при дебаге(с ключём -d2).
Без дебага же это сообщение не появляется
С ключем -d3/-d2 компилятор будет выводить информацию о переполнении стака. Если есть рекурсия, он не сможет определить занимаемую память и скажет об этом.
Также рекурсия бывает, например, если OnPlayerCommandText вызывается из него же.

pawn Code:
#include <a_samp>

public OnPlayerCommandText(playerid, cmdtext[])
{
    if(!strcmp(cmdtext, "/first") && strlen(cmdtext) == strlen("/first"))
    {
        OnPlayerCommandText(playerid, "/second");
        return 1;
    }
    else if(!strcmp(cmdtext, "/second") && strlen(cmdtext) == strlen("/second"))
    {
        return 1;
    }
    return 0;
}
Quote:

Pawn compiler 3.2.3664 Copyright © 1997-2006, ITB CompuPhase

Header size: 160 bytes
Code size: 524 bytes
Data size: 152 bytes
Stack/heap size: 16384 bytes; estimated max. usage: unknown, due to recursion
Total requirements: 17220 bytes




Re: Как найти рекурсию в моде ? - Mexanizm93 - 07.02.2013

Использую командный процессор YCMD. Возможна ли рекурсия?
OnPlayerCommandText пустой. Возвращается 0


Re: Как найти рекурсию в моде ? - Alexander_Petrov - 07.02.2013

Quote:
Originally Posted by Mexanizm93
View Post
Использую командный процессор YCMD. Возможна ли рекурсия?
OnPlayerCommandText пустой. Возвращается 0
В других коллбеках и пабликах поищи.


Re: Как найти рекурсию в моде ? - Mexanizm93 - 07.02.2013

Искал несколько раз. Внимательно искал но неудачно.
Может быть существует какой либо скрипт, который ищит рекурсия наподобие вызова функции в теле самой же функции ?


Re: Как найти рекурсию в моде ? - AirKite - 07.02.2013

Quote:
Originally Posted by Mexanizm93
View Post
Искал несколько раз. Внимательно искал но неудачно.
Может быть существует какой либо скрипт, который ищит рекурсия наподобие вызова функции в теле самой же функции ?
Нет конечно. Что собственно вы пытаетесь найти? Вам показали пример, при котором компилятор будет выводить о возможной рекурсии.

Quote:
Originally Posted by Mexanizm93
View Post
Использую командный процессор YCMD. Возможна ли рекурсия?
Не юзал, но насколько понимаю, как обычно инклудится весь ****** lib. В таком случае уверен на 99.9%.

Quote:
Originally Posted by Mexanizm93
View Post
OnPlayerCommandText пустой. Возвращается 0
Как же тогда по вашему работают команды?


Re: Как найти рекурсию в моде ? - NameNone - 07.02.2013

Quote:
Originally Posted by Mexanizm93
View Post
Использую командный процессор YCMD. Возможна ли рекурсия?
OnPlayerCommandText пустой. Возвращается 0
Рекурсия - повторный вызов функции в теле самой функции. Вызвать можно не только команды.


Re: Как найти рекурсию в моде ? - Mexanizm93 - 07.02.2013

Quote:
Originally Posted by AirKite
Как же тогда по вашему работают команды?
Пардон, перепутал. Единица возвращается


Re: Как найти рекурсию в моде ? - frog163 - 08.02.2013

Quote:
Originally Posted by Mexanizm93
View Post
Пардон, перепутал. Единица возвращается
OnPlayerCommandText используется в YCMD, именно там формируются и вызываются названия функций(команд) .


Re: Как найти рекурсию в моде ? - Mexanizm93 - 08.02.2013

Ответа на свой вопрос я так и не получил.


Re: Как найти рекурсию в моде ? - NameNone - 08.02.2013

Что такое рекурсия - ты знаешь. Как она выглядит - ты знаешь. Мозг - вроде бы есть. Удачи.


Re: Как найти рекурсию в моде ? - Richard_Gere - 08.02.2013

Если стоит крэшдетект, то он должен в таких случаях писать ошибку о рекурсии.


Re: Как найти рекурсию в моде ? - James_Braga - 08.02.2013

Если требует использования динамической памяти, то возможно ты где то вернул стринг, что то типо:

new string[100];
return string;


Re: Как найти рекурсию в моде ? - Alexander_Petrov - 08.02.2013

Можно попробовать сделать дебаг, выводить время до секунд и имя самой функции, на которую есть подозрения в лог.
Например, так:
pawn Code:
#include <a_samp>

public OnPlayerCommandText(playerid, cmdtext[])
{
    new h,m,s;
    gettime(h,m,s);
    printf("OnPlayerCommandText(%d, %s) | %d:%d:%d", playerid, cmdtext, h, m, s);
    if(!strcmp(cmdtext, "/first") && strlen(cmdtext) == strlen("/first"))
    {
        OnPlayerCommandText(playerid, "/second");
        return 1;
    }
    else if(!strcmp(cmdtext, "/second") && strlen(cmdtext) == strlen("/second"))
    {
        return 1;
    }
    return 0;
}
Аргументы коллбека тоже стоит вывести, чтобы быть уверенным, что используется для одного игрока или чего-то другого.
Но для этого нужно хотя бы примерно знать, где проблема.


Re: Как найти рекурсию в моде ? - Mexanizm93 - 08.02.2013

Quote:
Originally Posted by James_Braga
View Post
Если требует использования динамической памяти, то возможно ты где то вернул стринг, что то типо:

new string[100];
return string;
Стринги кое где возвращаю. Попробую комментировать и скомпилить


Крашдетект стоит но не каких ошибок не выводит.

Полное сообщение которое пишет компилятор при компилировании в дебаге:
Code:
Header size:          21744 bytes
Code size:          1797284 bytes
Data size:          1941740 bytes
Stack/heap size:      16384 bytes; estimated max. usage: unknown, due to recursion
Total requirements: 3777152 bytes



Re: Как найти рекурсию в моде ? - Richard_Gere - 08.02.2013

На сколько мне известно при дебаг моде это сообщение выводится всегда. Для примера попробуйте скомпилировать в дебаг моде какой-нибудь стандартный скрипт SAMP (attachments, test-cmds etc.)