Errores, fallos, preguntas - página 1681

 
Karputov Vladimir:
Es indiferente que las cotizaciones sean de ida o de vuelta. Es necesario controlar la condición prev_calculate==0 en el indicador - esto es el intercambio de la historia y el segundo punto - el modo de recuento de las barras cambiadas, es decir, de hecho rates_total -prev_calculate+1.

Deberías leer lo que se escribe antes de responder. ¡El código para reproducir el error del depurador! Se dan todos los datos para reproducirlo.

Aquí hay un script para reproducir el mismo error

int Func(){ return(0); }

int Func2()
{
//  return(0); // если расскоментировать и здесь поставить точку останова, то отладчик отработает, как надо  
  return(Func()); // здесь поставить точку останова (F9)
}

void OnStart()
{
  Func2();
}
 
fxsaber:
Debería leer lo que está escrito antes de responder. Código para reproducir el error del depurador Se dan todos los datos para la reproducción.

Te he contestado: no te importa cuántas veces se llame a OnCalculate. Su tarea es proporcionar un recálculo total o parcial del indicador analizando dos valores: rates_total, prev_calculate y la condición cuando prev_calculate==0.

No hay ninguna condición estricta de que OnCalculate() deba ser llamado una o dos veces. OnCalculate() no debe nada a nadie. Pero el programador debe controlar dos valores: rates_total, prev_calculate y la condición cuando prev_calculate==0.

 
Karputov Vladimir:
Te lo dije: no te importa cuántas veces se llame a OnCalculate. Su tarea es proporcionar un recálculo total o parcial del indicador, analizando dos valores: rates_total, prev_calculate y la condición cuando prev_calculate==0.

Me importa cuántas veces se llama al depurador y cuántas veces se llama a OnCalculate. Soy una persona increíble por naturaleza. Y me importa todo.

Intentas enseñarme algo sin entender la esencia del problema. Gracias, por supuesto. Pero escuchemos y oigamos a nuestro oponente.

 
fxsaber:

No, lo estoy ejecutando en RTS ahora, cuando los kotirs están de pie. Se ha descubierto que se llama una vez y el depurador miente, mostrando como si fueran dos. Código para jugar (ejecutar en un personaje en el que no hay ticks)

Después de pulsar F5, llegará a un punto de interrupción. Y después de una segunda pulsación en F5 - de forma similar. Aunque esto no debería ser - como una confirmación, puedes acortar esa línea en el código y probar con ella.

Así se puede ver lo que está mal. Observa el valor de i en la primera y segunda parada.

int Func(int& i)
{
        i++;
        return 0;
}

int OnCalculate( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[] )
{
        int i = 1;
        return(Func(i)); // здесь поставить точку останова (F9)
}
 
Sergei Vladimirov:

Así se puede ver cuál es el problema. Traza el valor de i en la primera y segunda paradas.

Lo rastreé, por eso lo escribí.

Descubrí que se llama una vez, pero el depurador miente, mostrándolo como si fueran dos.

¿Por qué el depurador me devuelve al mismo lugar después de la segunda pulsación de F5? No ocurre lo mismo con return(0), que es correcto.

 

No miente, se detiene dos veces - antes de calcular la expresión entre corchetes, y después de ella, justo antes del retorno.

Por cierto, un truco muy práctico, en mi opinión. Necesito recordarlo. No es necesario poner el resultado entre paréntesis en una variable separada para comprobar el valor de retorno antes de salir, el propio depurador se detendrá de nuevo.

 
Sergei Vladimirov:

No miente, se detiene dos veces - antes de calcular la expresión entre corchetes, y después de ella, justo antes del retorno.

Por cierto, un truco muy práctico, en mi opinión. Necesito recordarlo.No es necesario poner el resultado entre paréntesis en una variable separada para comprobar el valor de retorno antes de salir, el propio depurador se detendrá por segunda vez.

Estoy de acuerdo en que esto es conveniente. Pero, ¿cómo averiguar el resultado del retorno antes de la salida sin una variable en el depurador?
 
fxsaber:


Pon el código así:

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   int i=1;
   Print("Перед: i ",i,",rates_total ",rates_total,", prev_calculated ",prev_calculated);
   int rezult=Func(i);
   Print("После: i ",i,",rates_total ",rates_total,", prev_calculated ",prev_calculated);
   return(rezult); // здесь поставить точку останова (F9)
  }

y poner el indicador en el gráfico. Y luego volver a cargar el terminal (no es necesario quitar el indicador del gráfico). Verá que OnCalculate() puede ser llamado una o dos o incluso tres veces. Es decir, como he dicho antes, no hay reglas estrictas.

 
Karputov Vladimir:

Pon el código así:

y poner el indicador en el gráfico. Y luego volver a cargar el terminal (no es necesario quitar el indicador del gráfico). Verá que OnCalculate() puede ser llamado una o dos o incluso tres veces. Es decir, como he dicho antes, no hay reglas estrictas.

Me obligas a quejarte de que no estás dispuesto a escuchar lo que escribe tu oponente.
 
fxsaber:
Estoy de acuerdo en que esto es útil. Pero, ¿cómo puedo averiguar el resultado de retorno antes de la salida sin una variable en el depurador?

Mira en el cuerpo de Func() para ver lo que devuelve antes de salir. Estoy hablando de un caso especial. Si el valor se calcula directamente entre paréntesis, por supuesto, no se puede.

PS. Aunque... ¿Por qué no? En la segunda parada, busca todos los argumentos return() y calcula el resultado. )