Errori, bug, domande - pagina 1963

 
A100:
Se la differenza è enorme, allora perché entrambe le varianti compilano normalmente in C++?

Qui non c'è alcuna autorità su C++ in questo caso, poiché ho basato le mie conclusioni sulla logica. Sopra, ho rielaborato l'esempio con una dereferenza.

Tutto quello che dovete fare è fare una tale sostituzione

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

Come il dereferenziamento sarà completamente diverso. Si può chiedere al compilatore di essere "più intelligente di un pazzo" e agire come fa in C++. Ma questa soluzione è davvero discutibile.

Cioè tale "aiuto" può essere implementato nel compilatore, ma viene mostrata la differenza di approccio.

 
A100:
va bene. Che differenza fa?

apparentemente, f non è visto come un puntatore a una funzione in un semplice passaggio al compilatore.

 
Комбинатор:

apparentemente, quando viene passato al compilatore, f non viene preso come puntatore a una funzione.

Sono d'accordo (è semplice e non c'è essenzialmente nessuna differenza)
 
Комбинатор:

apparentemente, quando viene passato al compilatore, f non viene preso come puntatore a una funzione.

E non dovrebbe, almeno per l'ambiguità.

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:

E non dovrebbe, se non altro per l'ambiguità

Non c'era questa ambiguità nell'esempio originale... l'hai creato tu... e l'hai usato per spiegare tutto.
 
fxsaber:

E non dovrebbe, se non altro per l'ambiguità

Nel typedef originale è un alias per un tipo, non un altro tipo, quindi è davvero una grande domanda per gli sviluppatori perché il nome del tipo mostra un alias invece di un tipo.
 

Errore durante la compilazione

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) нормально
}

Se (1) è OK, perché un errore in (2) se (3) è OK?
 
Комбинатор:
Nel typedef originale è un alias per un tipo, non un altro tipo, quindi è davvero una grande domanda per gli sviluppatori perché il nome del tipo mostra un alias invece di un tipo.

Sono d'accordo.

 

A100:

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

Si prega di spiegare il typeof. Non sono riuscito a trovare una buona spiegazione per i programmatori inesperti.

 
Durante una singola esecuzione e visualizzazione i registri sono pieni di migliaia di voci di questo 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

E bisogna aspettare lunghi secondi perché si presentino. E mi interessa solo il registro, che faccio io stesso in OnDeinit. Perché devo forzare ogni volta questi registri, che vengono letti in casi MOLTO rari? C'è una voce di menu speciale in Agent Log Viewer. E l'assenza di questi registri durante l'ottimizzazione non fa sentire nessuno incompleto. Allora perché tutta questa invadenza in centinaia di megabyte (specialmente se qualche cattivo EA sta cercando di aprire un affare ad ogni tick, ottenendo la modalità Unsupported filled)?

È possibile separare le mosche dalle cotolette nel tester? Lo stesso che nel terminale: un log per le stampe dall'EA stesso e un log del terminale. Stanco di aspettare per lunghi secondi mentre quelle decine di migliaia di messaggi inutili nel registro per ogni punto d'ordine per passare e si può vedere le ultime righe di completamento backtest.

È stato un lungo periodo di tempo. Potrei non essere l'unico infastidito.