Как найти рекурсию в моде ? -
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
Не хотелось бы использовать pragma dynamic. Это обход а не само решения.
Подскажите пожалуйста максимальный размер массива и об этом как можно поодробней
|
Это само решение. Суть в том, что вы изменяете вводные компилятора.
Re: Как найти рекурсию в моде ? -
Mexanizm93 - 07.02.2013
Дело всё в том, что это сообщение компилятор выводит лиш при дебаге(с ключём -d2).
Без дебага же это сообщение не появляется
Re: Как найти рекурсию в моде ? -
Alexander_Petrov - 07.02.2013
Quote:
Originally Posted by Mexanizm93
Дело всё в том, что это сообщение компилятор выводит лиш при дебаге(с ключём -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
Использую командный процессор YCMD. Возможна ли рекурсия?
OnPlayerCommandText пустой. Возвращается 0
|
В других коллбеках и пабликах поищи.
Re: Как найти рекурсию в моде ? -
Mexanizm93 - 07.02.2013
Искал несколько раз. Внимательно искал но неудачно.
Может быть существует какой либо скрипт, который ищит рекурсия наподобие вызова функции в теле самой же функции ?
Re: Как найти рекурсию в моде ? -
AirKite - 07.02.2013
Quote:
Originally Posted by Mexanizm93
Искал несколько раз. Внимательно искал но неудачно.
Может быть существует какой либо скрипт, который ищит рекурсия наподобие вызова функции в теле самой же функции ?
|
Нет конечно. Что собственно вы пытаетесь найти? Вам показали пример, при котором компилятор будет выводить о возможной рекурсии.
Quote:
Originally Posted by Mexanizm93
Использую командный процессор YCMD. Возможна ли рекурсия?
|
Не юзал, но насколько понимаю, как обычно инклудится весь ****** lib. В таком случае уверен на 99.9%.
Quote:
Originally Posted by Mexanizm93
OnPlayerCommandText пустой. Возвращается 0
|
Как же тогда по вашему работают команды?
Re: Как найти рекурсию в моде ? -
NameNone - 07.02.2013
Quote:
Originally Posted by Mexanizm93
Использую командный процессор YCMD. Возможна ли рекурсия?
OnPlayerCommandText пустой. Возвращается 0
|
Рекурсия - повторный вызов функции в теле самой функции. Вызвать можно не только команды.
Re: Как найти рекурсию в моде ? -
Mexanizm93 - 07.02.2013
Quote:
Originally Posted by AirKite
Как же тогда по вашему работают команды? 
|
Пардон, перепутал. Единица возвращается
Re: Как найти рекурсию в моде ? -
frog163 - 08.02.2013
Quote:
Originally Posted by Mexanizm93
Пардон, перепутал. Единица возвращается
|
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
Если требует использования динамической памяти, то возможно ты где то вернул стринг, что то типо:
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.)