Как найти рекурсию в моде ?
#1

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

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

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

Спасибо
Reply
#2

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

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

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

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

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

Reply
#7

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

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

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

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
Как же тогда по вашему работают команды?
Reply
#11

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

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

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

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

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

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

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

new string[100];
return string;
Reply
#18

Можно попробовать сделать дебаг, выводить время до секунд и имя самой функции, на которую есть подозрения в лог.
Например, так:
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;
}
Аргументы коллбека тоже стоит вывести, чтобы быть уверенным, что используется для одного игрока или чего-то другого.
Но для этого нужно хотя бы примерно знать, где проблема.
Reply
#19

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
Reply
#20

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


Forum Jump:


Users browsing this thread: 1 Guest(s)