Задача Трассировки (построение графа функций) - страница 4

 
Я такой шаблон использовал:
/*
extern bool TraceIsAllowed;                              // Показывать трассировку?
//+------------------------------------------------------------------+
//| XXX
//+------------------------------------------------------------------+
void XXX(string MasterName, string ProgramTrace, string Parameter)
  {
   string SlaveName="XXX";                               // Имя функции.
   ProgramTrace=ProgramTrace+"=>"+SlaveName;             // Путь обращения к функции.
   if( Parameter!="" ) ProgramTrace=ProgramTrace+"("+Parameter+")";
   string Message=ProgramTrace;                          // Функциональные сообщения.
   LastErrorCode=GetLastError();
   if( LastErrorCode>0 )
     {                                                   // Ошибка или некорректные параметры.
      Message=Message+" ERROR "+LastErrorCode+" at Start";
      Message=Message+"";                                // Значения параметров.
      Print(Message); return;                            // Функцию не выполнять.
     }
   if( TraceIsAllowed ) Print(Message);                  // Задана трассировка программы .
//----
   
//----
   LastErrorCode=GetLastError();
   if( LastErrorCode>0 ) Message=Message+" ERROR "+LastErrorCode;
   if( Message!=ProgramTrace )
     {                                                   // Были функциональные сообщения.
      Message=Message+" ";                               // Функция выполнена.
      Print(Message);                                    // Печать функциональных сообщений.
     }
   return;
  }
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
   string SlaveName="Init";                              // Имя функции.
   string ProgramTrace=SlaveName;                        // Путь обращения к функции.
   string Message=ProgramTrace;                          // Функциональные сообщения.
   LastErrorCode=GetLastError();
   if( LastErrorCode>0 )
     {                                                   // Ошибка или некорректные параметры.
      Message=Message+" ERROR "+LastErrorCode+" at Start";
      Print(Message); return(0);                         // Функцию не выполнять.
     }
   if( TraceIsAllowed ) Print(Message);                  // Задана трассировка программы .
//----
   
//----
   LastErrorCode=GetLastError();
   if( LastErrorCode>0 ) Message=Message+" ERROR "+LastErrorCode;
   if( Message!=ProgramTrace )
     {                                                   // Были функциональные сообщения.
      Message=Message+" ";                               // Функция выполнена.
      Print(Message);                                    // Печать функциональных сообщений.
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   string SlaveName="Start";                             // Имя функции.
   string ProgramTrace=SlaveName;                        // Путь обращения к функции.
   string Message=ProgramTrace;                          // Функциональные сообщения.
   LastErrorCode=GetLastError();
   if( LastErrorCode>0 )
     {                                                   // Ошибка или некорректные параметры.
      Message=Message+" ERROR "+LastErrorCode+" at Start";
      Print(Message); return(0);                         // Функцию не выполнять.
     }
   if( TraceIsAllowed ) Print(Message);                  // Задана трассировка программы .
//----
   
//----
   LastErrorCode=GetLastError();
   if( LastErrorCode>0 ) Message=Message+" ERROR "+LastErrorCode;
   if( Message!=ProgramTrace )
     {                                                   // Были функциональные сообщения.
      Message=Message+" ";                               // Функция выполнена.
      Print(Message);                                    // Печать функциональных сообщений.
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
   string SlaveName="DeInit";                            // Имя функции.
   string ProgramTrace=SlaveName;                        // Путь обращения к функции.
   string Message=ProgramTrace;                          // Функциональные сообщения.
   LastErrorCode=GetLastError();
   if( LastErrorCode>0 )
     {                                                   // Ошибка или некорректные параметры.
      Message=Message+" ERROR "+LastErrorCode+" at Start";
      Print(Message); return(0);                         // Функцию не выполнять.
     }
   if( TraceIsAllowed ) Print(Message);                  // Задана трассировка программы .
//----
   
//----
   LastErrorCode=GetLastError();
   if( LastErrorCode>0 ) Message=Message+" ERROR "+LastErrorCode;
   if( Message!=ProgramTrace )
     {                                                   // Были функциональные сообщения.
      Message=Message+" ";                               // Функция выполнена.
      Print(Message);                                    // Печать функциональных сообщений.
     }
   return(0);
  }
*/
//+------------------------------------------------------------------+
 
tara:
Я такой шаблон использовал:

это малость не то.
 
sergeev:

вижу в коде тоже два блока - в начале и в конце... а надо один.

Который в конце - не имеет отношения к трассировке. Можете удалить.
 
tara:
Который в конце - не имеет отношения к трассировке. Можете удалить.

да. вижу. но все равно... не ошибки рассматриваем, а каждый вход в функцию.
 
sergeev:

да. вижу. но все равно... не ошибки рассматриваем, а каждый вход в функцию.

Ошибки - тоже можно выкинуть.

extern bool TraceIsAllowed;                              // Показывать трассировку?
//+------------------------------------------------------------------+
//| XXX
//+------------------------------------------------------------------+
void XXX(string MasterName, string ProgramTrace, string Parameter)
  {
   string SlaveName="XXX";                               // Имя функции.
   ProgramTrace=ProgramTrace+"=>"+SlaveName;             // Путь обращения к функции.
   if( Parameter!="" ) ProgramTrace=ProgramTrace+"("+Parameter+")";
   string Message=ProgramTrace;                          // Функциональные сообщения.
   if( TraceIsAllowed ) Print(Message);                  // Задана трассировка программы .
//----
   
//----
   return;
  }
 
... А тот ли язык Mql, чтобы в нем делать трассировку?!!
 
tara:

Ошибки - тоже можно выкинуть.

:))

задача (если читали первый пост) сводится к добавлению всего одной служебной-функции в каждую функцию исходного кода - сразу после "{".

Но с таким расчетом, чтоб получить все проходы исходного кода и построить дерево вызовов.

При этом никоим образом не меняется ни входные параметры исходных функций, ни их результаты или код внутри


jartmailru:
... А тот ли язык Mql, чтобы в нем делать трассировку?!!

Не про чистый трейс идет речь. А только про построение графа функций.
 
sergeev:
Не про чистый трейс идет речь. А только про построение графа функций.
Статический анализ кода... Исполнение не требуется.
Код бьётся на функции (блоки) - дальше анализируется кто кого вызывает.
 
jartmailru:
... А тот ли язык Mql, чтобы в нем делать трассировку?!!

Почему-бы и нет, если хочется.

 
sergeev:

:))

задача (если читали первый пост) сводится к добавлению всего одной служебной-функции в каждую функцию исходного кода - сразу после "{".

Но с таким расчетом, чтоб получить все проходы исходного кода и построить дерево вызовов.

Неужели неочевидна нерешаемость этой задачи? Эдак можно было бы упразнить пары арифметических () [] и операторных {} скобок, и заменить на единственную - открывающую. Слабо?

;)

Причина обращения: