Errores, fallos, preguntas - página 1963

 
A100:
Si la diferencia es enorme, ¿por qué ambas variantes compilan normalmente en C++?

Aquí no hay ninguna autoridad en C++ en este caso, ya que basé mis conclusiones en la lógica. Arriba, he rehecho el ejemplo con una dereferencia.

Todo lo que tienes que hacer es hacer esa sustitución

// typedef void (*fn)();
typedef void (*fn123)();

La dereferencia será completamente diferente. Puedes pedirle al compilador que sea "más inteligente que un tonto" y actúe como lo hace en C++. Pero esta solución es realmente discutible.

Es decir, esa "ayuda" puede implementarse en el compilador, pero se muestra la diferencia de enfoques.

 
A100:
está bien. ¿Qué diferencia hay?

aparentemente, f no se ve como un puntero a una función en un simple pase al compilador.

 
Комбинатор:

aparentemente, cuando se pasa al compilador, f no se toma como un puntero a una función.

Estoy de acuerdo (es simple y no hay esencialmente ninguna diferencia)
 
Комбинатор:

aparentemente, en una simple pasada al compilador, f no se toma como un puntero a una función.

Y no debería, al menos por la ambigüedad.

typedef void (*fn)();

template<typename T>
void g( T Value ) { Print(typename(Value)); }
void f() {}

void g( fn Value ) { Print(typename(Value)); }
void OnStart()
{
  g( f ); // void(*fn)()

  int f = 0;  
  g( f ); // int
}
 
fxsaber:

Y no debería, aunque sólo sea por la ambigüedad

No había tal ambigüedad en el ejemplo original... tú lo creaste... y lo usaste para explicar todo.
 
fxsaber:

Y no debería, aunque sólo sea por la ambigüedad

En el typedef original es un alias para un tipo, no otro tipo, así que es realmente una gran pregunta para los desarrolladores por qué el nombre del tipo muestra un alias en lugar de un tipo.
 

Error durante la compilación

struct A {
                void f() {}
        static  void f( int ) {}
};
template<typename T>
void g( T ) {}
void f( int ) {}
typedef void (*fn)( int );
void OnStart()
{
        g(  (fn)   f ); //(1) нормально
        g(  (fn)A::f ); //(2) error: '(void(*fn)(int))' - cannot resolve function address
        fn ff = A::f;
        g( ff        ); //(3) нормально
}

Si (1) está bien, ¿por qué un error en (2) si (3) está bien?
 
Комбинатор:
En el typedef original es un alias para un tipo, no otro tipo, así que es realmente una gran pregunta para los desarrolladores por qué el nombre del tipo muestra un alias en lugar de un tipo.

Estoy de acuerdo.

 

A100:

template<typename T>
string typeof( T ) { return typename T; }

Por favor, explique el tipo de. No he podido encontrar una buena explicación para los programadores sin experiencia.

 
Durante una sola ejecución y visualización los registros se llenan de miles de entradas de este tipo
2017.08.16 20:26:06.477 2017.08.01 10:04:06   order modified [#253  buy limit 1.00 EURUSD at 1.18159]
2017.08.16 20:26:06.477 2017.08.01 10:04:06   order modified [#253  buy limit 1.00 EURUSD at 1.18159]
2017.08.16 20:26:06.477 2017.08.01 10:04:06   order modified [#253  buy limit 1.00 EURUSD at 1.18159]
2017.08.16 20:26:06.477 2017.08.01 10:04:06   order modified [#253  buy limit 1.00 EURUSD at 1.18159]
2017.08.16 20:26:06.477 2017.08.01 10:04:06   order modified [#253  buy limit 1.00 EURUSD at 1.18159]
2017.08.16 20:26:06.477 2017.08.01 10:04:06   take profit triggered #251  sell 1.00 EURUSD 1.18166 tp: 1.18159 [#254  buy 1.00 EURUSD at 1.18159]
2017.08.16 20:26:06.477 2017.08.01 10:04:06   deal #251  buy 1.00 EURUSD at 1.18159 done (based on order #254)
2017.08.16 20:26:06.477 2017.08.01 10:04:06   deal performed [#251  buy 1.00 EURUSD at 1.18159]
2017.08.16 20:26:06.477 2017.08.01 10:04:06   order performed buy 1.00 at 1.18159 [#254  buy 1.00 EURUSD at 1.18159]
2017.08.16 20:26:06.477 2017.08.01 10:04:06   order [#253  buy limit 1.00 EURUSD at 1.18159] triggered

Y hay que esperar largos segundos para que aparezcan. Y sólo me interesa el registro, que hago yo mismo en OnDeinit. ¿Por qué tengo que forzar cada vez estos registros, que se leen en casos MUY raros? Hay un elemento de menú especial en el Visor de Registros del Agente. Y la ausencia de estos registros durante la optimización no hace que nadie se sienta incompleto. Entonces, ¿por qué toda esta molestia en cientos de megabytes (especialmente si algún EA malo está tratando de abrir un acuerdo en cada tic, obteniendo el modo de llenado sin soporte)?

¿Es posible separar las moscas de las chuletas en el probador? Lo mismo que en el terminal: un registro para las impresiones del propio EA y un registro del terminal. Cansado de esperar durante largos segundos mientras esas decenas de miles de mensajes innecesarios en el registro para cada punto de orden para pasar y se puede ver las últimas líneas de finalización de backtest.

Ha pasado mucho tiempo. Puede que no sea el único molesto.