トレースタスク(関数グラフの作成) - ページ 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:

コードにも、最初と最後に2つのブロックが見えますが...1つでいいんですよね?

最後の方は、トレースとは関係ないですね。削除することができます。
 
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:

間違いも捨てることができる。

:))

最初の投稿を読むと、問題は、ソースコードの各関数に、"{" の直後に、サービス関数を1つだけ追加することにあります。

しかし、そのような方法で、ソースコードのすべての通路を取得し、コールツリーを構築することができます。

ソース関数の入力パラメータは一切変更せず、内部の結果やコードも変更しません。


jartmailru
...Mqlはトレースを行うのに適した言語なのか!!!!

純粋なトレースのことではありません。関数のグラフを構成することだけです。
 
sergeev:
純粋なトレースのことではありません。関数グラフの構築についてだけ。
静的コード解析...実行は必須ではありません。
コードを関数(ブロック)に分割し、誰が誰を呼んでいるのかを分析するのです。
 
jartmailru:
...Mqlはトレースを行うのに適した言語なのか!!!!

いいじゃないですか、やりたいなら。

 
sergeev:

:))

最初の投稿を読むと、問題は、ソースコードの各関数に、"{" の直後に、サービス関数を1つだけ 追加することにあります。

しかし、すべてのソースコードのパスを取得し、コールツリーを構築するような方法で。

この 課題が解決不可能であることは明らかではないでしょうか。そうすれば、算術()[] と演算子{}の 括弧のペアをなくして、1つの開き括弧に置き換えることができるのです。それはあまり良くないことでしょうか?

;)