Erreurs, bugs, questions - page 2746

 
fxsaber:

Alors, en quoi cela permet-il d'éviter un nombre énorme de vérifications lorsque SymbolInfoTick est appelé des dizaines de milliards de fois ?

Ce n'est pas le cas. Cela permet seulement de ne pas copier inutilement la chaîne de caractères elle-même.

 
Koldun Zloy:

Non. Cela permet seulement de ne pas copier inutilement la chaîne de caractères elle-même.

Il est donc évident que la solution de la référence à la chaîne de caractères pour les fonctions SymbolInfo est la bonne, si l'on veut que l'Optimiseur soit plus efficace.

 

Mon débogueur refuse de fonctionner dans l'un de mes projets. En outre, son comportement est difficile à prévoir. Parfois, il refuse tout simplement d'entrer dans les points d'arrêt. Il refuse également d'entrer dans certaines fonctions. Au début, je pensais que la raison était les mises à jour (peut-être que quelque chose s'est mal passé avec le débogage). Mais dans d'autres programmes plus simples, tout semble fonctionner. Je ne l'ai pas beaucoup consulté, cependant, car je travaille sur mon projet principal. Il est assez complexe et comprend 15 modules de ma propre conception uniquement (je n'ai pas compté le nombre de modules standard). Le module principal contient jusqu'à 2000 lignes. Je pensais que c'était peut-être une question de complexité du projet... De même, à certains endroits, j'utilise des macros pour les extraits de code répétitifs. J'utilise également des éléments standard de l'interface utilisateur, tels que CAppDialog, CCheckGroup, CComboBox, CButton etc. que j'ai réécrits pour la fonctionnalité de mon programme. Peut-être que le débogage ne fonctionne pas à cause d'eux... Par exemple, la méthode CCheckGroup::itemCheckState(const string item), que j'ai spécifiquement écrite, n'est pas déboguée. La méthode trouve l'élément de la case à cocher et vérifie s'il est sélectionné (son état) :

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CCheckGroup::itemCheckState(const string item) {
  int total = m_strings.Total();
  
  if(total != m_states.Total())
    return -1;
    
  int i = 0;
  for(; i < total; i++) {
    if(m_strings.At(i) == item)
      return m_states.At(i);
  }
  
  return -1;
}

Voici le type d'interface utilisateur que j'ai obtenu :

UI

Certains des éléments de l'interface utilisateur sont temporairement classés. Et voici une branche où j'ai décrit comment j'ai remplacé les méthodes Show() et Hide() de l'élément CAppDialog: https://www.mql5.com/ru/forum/338301. Le compilateur s'est plaint à ce moment-là et une erreur critique s'est produite.

Au final, le projet se compile normalement, le compilateur ne génère aucune erreur. Mais le débogage échoue et ne montre pas l'exécution de certains fragments de code, fonctions, méthodes, etc.

D'après ce que je comprends, il peut y avoir plusieurs raisons à cela.

  1. Code compliqué du projet, utilisation de macros
  2. Code compliqué utilisant des éléments d'interface utilisateur standard, tels que CAppDialog, CCheckGroup, CComboBox, CButton (pour lesquels j'ai également écrit de nouvelles méthodes et redéfini certaines méthodes existantes).
  3. Bug du débogueur lié à la nouvelle build (possible, peu probable).

Informations sur la construction et le système :

2020.05.21 09:35:09.325 Terminal MetaTrader 5 x64 build 2433 started for MetaQuotes Software Corp.

2020.05.21 09:35:09.326 Terminal Windows 10 build 14393, Intel Core i5-5200U @ 2.20GHz, 2 / 3 Go de mémoire, 61 / 380 Go de disque, IE 11, UAC, GMT+2

Quelqu'un a-t-il eu des problèmes similaires avec le débogueur et quelle pourrait en être la cause ?
 
fxsaber:

Il est donc évident qu'une solution de référence de chaîne pour les fonctions SymbolInfo est la bonne, si l'on veut que l'Optimizer soit plus efficace.

Tout est passé par référence de toute façon. La différence n'existait que dans l'ancien MQL4. Et il n'y a pas de contrôle lors de la lecture d'une chaîne de caractères.
 
Alexey Navoykov:
Ce lien n'a aucun sens, le développeur l'a dit. Tout est passé par le lien tel quel. La seule différence était dans l'ancien MQL4. Et il n'y a pas de contrôle lors de la lecture de la chaîne.

C'est seulement fatigant de faire de telles déclarations.

int f1( string Str )
{
  return((Str += Str) == Str);
}

int f2( string &Str )
{
  return((Str += Str) == Str);
}

int Bench1( const int Amount = 1 e8 )
{
  int Res = 0;
  string Str = NULL;
  
  for (int i = 0; i < Amount; i++)
    Res += f1(Str);
    
  Print(Res);
    
  return(Res);    
}

int Bench2( const int Amount = 1 e8 )
{
  int Res = 0;
  string Str = NULL;
  
  for (int i = 0; i < Amount; i++)
    Res += f2(Str);

  Print(Res);
    
  return(Res);    
}

void OnStart()
{
  BENCH(Bench1())
  BENCH(Bench2())

  BENCH(Bench1())
  BENCH(Bench2())
}


        100000000
        Time[Bench1()] = 727585
        100000000
        Time[Bench2()] = 657464
        100000000
        Time[Bench1()] = 794205
        100000000
        Time[Bench2()] = 670440
 
fxsaber:

C'est seulement fatigant de faire des déclarations de ce genre.


C'est peut-être plus facile à écrire :

int f1( string Str )
{
  return(Str == NULL || Str == "");
}

?...

Pourquoi boire quelque chose comme ça ?

int f1( string Str )
{
  return((Str += Str) == Str);
}
 
Mihail Matkovskij:

C'est peut-être plus facile à écrire :

Il y a un autre type de discussion.

 
fxsaber:

C'est seulement fatigant de faire de telles déclarations.

Pour éviter d'être sans fondement, donnez-moi un point de repère où la chaîne ne change pas.
 
TheXpert:
Pour éviter d'être sans fondement, donnez-moi un point de repère pour les tests où la chaîne ne change pas.
int f1( const string Str )
{
  return(Str + "1" != Str);
}

int f2( const string &Str )
{
  return(Str + "1" != Str);
}
        10000000
        Time[Bench1()] = 334596
        10000000
        Time[Bench2()] = 338559
        10000000
        Time[Bench1()] = 384711
        10000000
        Time[Bench2()] = 344346
 

Bonjour, le journal MT5 affiche le message suivant : 2020.05.21 05:49:44.364 L'hôte virtuel n'a pas réussi à obtenir la liste des hôtes virtuels (www.mql5.com:443 send request failed [12002]).

Pouvez-vous me dire ce que cela signifie et ce qu'il faut faire ?

Merci !

Raison: