Trace task (costruire il grafico di una funzione) - pagina 4

 
Ho usato un modello come questo:
/*
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:
Ho usato un modello come questo:

è un po' diverso.
 
sergeev:

Vedo anche due blocchi nel codice, uno all'inizio e uno alla fine... ma ne ho bisogno.

Quello alla fine non ha niente a che fare con il ricalco. Puoi cancellarlo.
 
tara:
Quello alla fine è irrilevante per il tracciamento. Puoi cancellarlo.

Sì. Capisco. Ma comunque... non guardiamo gli errori, ma ogni ingresso alla funzione.
 
sergeev:

Sì, lo vedo, ma comunque... Non guardiamo gli errori, guardiamo ogni ingresso alla funzione.

Anche gli errori possono essere buttati via.

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 è il linguaggio giusto per fare il tracciamento!
 
tara:

Anche gli errori possono essere buttati via.

:))

il problema (se leggete il primo post) si riduce all'aggiunta di una sola funzione di servizio ad ogni funzione nel codice sorgente - subito dopo "{".

Ma in modo tale da ottenere tutti i passaggi del codice sorgente e costruire un albero delle chiamate.

Non cambia in alcun modo i parametri di input delle funzioni sorgente, né cambia i risultati o il codice all'interno di


jartmailru:
... Mql è il linguaggio giusto per fare il tracciamento!

Non si tratta di una traccia pura. Si tratta solo di costruire il grafico di una funzione.
 
sergeev:
Non si tratta di una traccia pura. Si tratta solo di costruire il grafico della funzione.
Analisi statica del codice... L'esecuzione non è richiesta.
Il codice viene spezzato in funzioni (blocchi) e poi si analizza chi chiama chi.
 
jartmailru:
... Mql è il linguaggio giusto per fare il tracciamento!

Perché no, se vuoi.

 
sergeev:

:))

il problema (se leggete il primo post) si riduce all'aggiunta di una sola funzione di servizio ad ogni funzione nel codice sorgente - subito dopo "{".

Ma in modo tale da ottenere tutti i passaggi di codice sorgente e costruire l'albero delle chiamate.

Non è ovvio che questo compito è irrisolvibile? In questo modo potremmo eliminare le coppie di parentesi aritmetiche () [] e operatore {} e sostituirle con una sola aperta. Sarebbe troppo brutto?

;)