Errores, fallos, preguntas - página 2746

 
Koldun Zloy:

No. Todavía no se conoce en tiempo de compilación.

Entonces, ¿cómo ayuda a evitar un gran número de comprobaciones cuando SymbolInfoTick es llamado decenas de miles de millones de veces?

 
fxsaber:

Entonces, ¿cómo ayuda a evitar un gran número de comprobaciones cuando SymbolInfoTick es llamado decenas de miles de millones de veces?

No lo hace. Sólo ayuda a no copiar la propia cadena innecesariamente.

 
Koldun Zloy:

No. Sólo ayuda a no copiar la propia cadena innecesariamente.

Entonces, obviamente, la solución de referencia de cadena para las funciones SymbolInfo es la correcta, si se quiere una mayor eficiencia del Optimizador.

 

Mi depurador se niega a funcionar en uno de mis proyectos. Además, su comportamiento es difícil de predecir. A veces simplemente se niega a entrar en los puntos de interrupción. También se niega a entrar en algunas funciones. Al principio pensé que el motivo eran las actualizaciones (tal vez algo salió mal en la depuración). Pero en otros programas más sencillos todo parece funcionar. Sin embargo, no lo he revisado mucho porque estoy trabajando en mi proyecto principal. Es bastante complejo e incluye 15 módulos de diseño propio únicamente (no he contado el número de módulos estándar). El módulo principal contiene hasta 2000 líneas. Pensé que tal vez se trate de la complejidad del proyecto... Además, en algunos lugares utilizo macros para fragmentos de código repetitivos. También utilizo elementos de interfaz de usuario estándar, como CAppDialog, CCheckGroup, CComboBox, CButton, etc. que reescribí para la funcionalidad de mi programa. Tal vez la depuración no funciona debido a ellos... Por ejemplo, el método CCheckGroup::itemCheckState(const string item), que escribí específicamente, no se depura. El método encuentra el elemento de la casilla de verificación y comprueba si está seleccionado (su Estado):

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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;
}

Este es el tipo de UI con el que terminé:

UI

Algunos de los elementos de la interfaz de usuario están clasificados temporalmente. Y aquí hay una rama donde describo cómo he anulado los métodos Show() y Hide() del elemento CAppDialog:https://www.mql5.com/ru/forum/338301 El compilador se quejó en ese momento y se produjo un error crítico.

Al final el proyecto compila normalmente, el compilador no genera ningún error. Pero la depuración falla y simplemente no muestra la ejecución de algunos fragmentos de código, funciones, métodos y demás.

Según tengo entendido, puede haber varias razones para ello.

  1. Código complicado del proyecto, uso de macros
  2. Código complicado que utiliza elementos de interfaz de usuario estándar, como CAppDialog, CCheckGroup, CComboBox, CButton (para los que también escribí nuevos métodos y redefiní algunos de los existentes)
  3. Error del depurador relacionado con la nueva compilación (posible, poco probable).

Información sobre la construcción y el sistema:

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 Gb de memoria, 61 / 380 Gb de disco, IE 11, UAC, GMT+2

¿Alguien ha tenido problemas similares con el depurador y cuál puede ser la causa?
 
fxsaber:

Es obvio entonces, que una solución de referencia de cadena para las funciones SymbolInfo es la correcta, si uno quiere más eficiencia del Optimizador.

Todo se pasa por referencia de todos modos. La diferencia era sólo en el antiguo MQL4. Y no hay comprobaciones al leer la cadena.
 
Alexey Navoykov:
Este enlace no tiene sentido, el desarrollador lo dijo. Todo se pasa por el enlace tal cual, la única diferencia fue en el antiguo MQL4. Y no hay comprobaciones al leer la cadena.

Sólo cansa hacer declaraciones como ésa.

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:

Sólo es fastidioso hacer afirmaciones así.


Tal vez sea más fácil escribir:

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

?...

¿Por qué beber algo así?

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

Puede ser más fácil de escribir:

Hay un tipo de discusión diferente.

 
fxsaber:

Sólo cansa hacer declaraciones como ésa.

Para no quedar sin argumentos, dame un punto de referencia en el que la cadena no cambie.
 
TheXpert:
Para no quedar sin argumentos, dame un punto de referencia para las pruebas en las que la cadena no cambia.
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