Tâche de traçage (construction d'un graphique de fonction) - page 4

 
J'ai utilisé un modèle comme celui-ci :
/*
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:
J'ai utilisé un modèle comme celui-ci :

c'est un peu différent.
 
sergeev:

Je vois aussi deux blocs dans le code, un au début et un à la fin... mais il m'en faut un.

Celui qui se trouve à la fin n'a rien à voir avec le traçage. Vous pouvez le supprimer.
 
tara:
Celui qui se trouve à la fin n'est pas pertinent pour le traçage. Vous pouvez le supprimer.

Oui. Je vois. Mais quand même... on ne regarde pas les erreurs, on regarde chaque entrée de la fonction.
 
sergeev:

Oui. Je peux voir ça. Mais quand même... Nous ne regardons pas les erreurs, nous regardons chaque entrée de la fonction.

Les erreurs peuvent également être rejetées.

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 est-il le bon langage pour faire du traçage ? !
 
tara:

Les erreurs peuvent aussi être rejetées.

:))

Le problème (si vous lisez le premier message) consiste à ajouter une seule fonction de service à chaque fonction dans le code source - juste après "{".

Mais de manière à obtenir tous les passages du code source et à construire un arbre d'appel.

Il ne modifie en aucune façon les paramètres d'entrée des fonctions sources, ni les résultats ou le code à l'intérieur.


jartmailru:
... Mql est-il le bon langage pour faire du traçage ?!

Il ne s'agit pas de trace pure. Il s'agit juste de construire le graphique d'une fonction.
 
sergeev:
Il ne s'agit pas de trace pure. Il s'agit juste de construire le graphique de la fonction.
Analyse statique du code... L'exécution n'est pas nécessaire.
Le code est décomposé en fonctions (blocs), puis on analyse qui appelle qui.
 
jartmailru:
... Mql est-il le bon langage pour faire du traçage ? !

Pourquoi pas, si vous le voulez.

 
sergeev:

:))

Le problème (si vous lisez le premier message) consiste à ajouter une seule fonction de service à chaque fonction dans le code source - juste après "{".

Mais de manière à obtenir tous les passages du code source et à construire l'arbre d'appel.

N'est-il pas évident que cette tâche est insoluble ? Ainsi, nous pourrions éliminer les paires de parenthèses arithmétiques () [] et d'opérateurs {} et les remplacer par une seule parenthèse ouvrante. Ce serait trop grave ?

;)