Errores, fallos, preguntas - página 2745

 
fxsaber:

Pregunta de optimización. En el probador, en cada garrapata necesito obtener una garrapata para seguir trabajando. Yo lo hago así.

Está claro que esta variante será más lenta:

Pero SymbolInfoTick también es más lento porque su parámetro de cadena no se pasa por referencia.

¿Es posible tener una sobrecarga regular de SymbolInfo* donde la cadena se pasa por referencia?

Es mejor tener

En el Optimizer, estas funciones son llamadas decenas de miles de millones de veces.

Llamar a Symbol() SIEMPRE se expande para acceder a la variable global _Symbol, así como a Digits(), Point(), Period(), GetLastError(), IsStopped(), UninitializeReason()

 
Ilyas:

La llamada Symbol() SIEMPRE se despliega para acceder a la variable global _Symbol, al igual que Digits(), Point(), Period(), GetLastError(), IsStopped(), UninitializeReason()

¿Y el paso de la cadena por referencia?

 
fxsaber:

¿Y pasar una cadena por referencia?

Aparentemente la razón es uno de los problemas irresolubles en MQL - pasar un literal como parámetro por const ref.

 
fxsaber:

¿Es posible tener sobrecargas regulares de SymbolInfo*, donde la cadena se pasa por referencia?

¿Cómo ayudarían?

int SymbolInfoTick( string  symbol ) { return 1; }
int SymbolInfoTick( string& symbol ) { return 2; }
void OnStart()
{
        Print( SymbolInfoTick( _Symbol ));
}

Sigue devolviendo 1, no 2

 
fxsaber:

¿Y pasar una cadena por referencia?

La cadena se pasa por referencia.

Hace tiempo que pasamos a "copy_on_write string" -> cuando se copia una cadena a otra el contenido no se copia inmediatamente (como era antes), el recuento de referencias del buffer de la cadena se incrementa
.
Por ejemplo, el recuento de referencias se incrementa cuando se pasa la cadena por valor, como parámetro y se disminuye después de la llamada.
Cuando

se modifica una cadena, se comprueba el recuento de referencias del buffer y, si hay más de una referencia, la cadena que se va a modificar se "desvincula" del buffer antiguo y se asigna uno nuevo.

 
A100:

¿Cómo van a ayudar?

Sigue devolviendo (llamado) 1, no 2

La variable _Symbol es constante
 
Ilyas:
La variable _Symbol es constante

Entonces la sobrecarga tampoco ayudará.

int SymbolInfoTick(       string  ) { return 1; }
int SymbolInfoTick( const string& ) { return 2; }
void OnStart()
{
        Print( SymbolInfoTick( _Symbol )); //Error
}

habrá un error ya en tiempo de compilación

 
Ilyas:

La cadena se pasa por referencia.

Hace tiempo que pasamos a "copy_on_write string" -> cuando se copia una cadena a otra el contenido no se copia inmediatamente (como antes), el número de referencias al buffer de la cadena se incrementa
Por ejemplo, el número de referencias se incrementa cuando la cadena se pasa por valor, como parámetro y se reduce después de la llamada.
Cuando

se modifica una cadena, se comprueba el recuento de referencias del buffer y, si hay más de una referencia, la cadena modificada se "desvincula" del buffer antiguo y se le asigna uno nuevo.

¿Está todo definido a nivel de compilación?

 

Error del compilador:

class CArray
{  
};

int ArraySize(const CArray&);


void Main()
{
  CArray arr;
  ArraySize(arr);  // Нормально
  
  CArray arrays[1];
  ArraySize(arrays[0]); // 'arrays' - array required
}
 
fxsaber:

¿Está todo definido a nivel de compilación?

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