Erros, bugs, perguntas - página 1963

 
A100:
Se a diferença é enorme, então porque é que ambas as variantes se compilam normalmente em C++?

Neste caso, não há qualquer autoridade sobre C++, uma vez que baseei as minhas conclusões na lógica. Acima, retrabalhei o exemplo com um desreferenciamento.

Tudo o que tem de fazer é fazer uma tal substituição

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

Como o desreferenciamento será completamente diferente. Pode pedir ao compilador para ser "mais esperto que um tolo" e agir da forma como o faz em C++. Mas esta solução é realmente discutível.

Isto é, tal "ajuda" pode ser implementada no compilador, mas a diferença nas abordagens é mostrada.

 
A100:
está bem. Que diferença é que isso faz?

aparentemente, f não é visto como um ponteiro para uma função numa simples passagem para o compilador.

 
Комбинатор:

aparentemente, quando passado para o compilador, f não é tomado como um ponteiro para uma função.

Concordo (é simples e não há essencialmente nenhuma diferença)
 
Комбинатор:

aparentemente, numa simples passagem para o compilador, f não é tomado como um ponteiro para uma função.

E não deveria, pelo menos por causa da ambiguidade.

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 não deveria, quanto mais não fosse devido à ambiguidade

Não havia tal ambiguidade no exemplo original... criou-o... e usou-o para explicar tudo.
 
fxsaber:

E não deveria, quanto mais não fosse devido à ambiguidade

No original, o dactilógrafo é um pseudónimo de um tipo, não de outro tipo, por isso é realmente uma grande questão para os criadores porque é que o nome do tipo mostra um pseudónimo em vez de um tipo.
 

Erro durante a compilação

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) está OK, porquê um erro em (2) se (3) está OK??
 
Комбинатор:
No original, o dactilógrafo é um pseudónimo de um tipo, não de outro tipo, por isso é realmente uma grande questão para os criadores porque é que o nome do tipo mostra um pseudónimo em vez de um tipo.

Concordo.

 

A100:

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

Por favor, explique o tipo de. Não consegui encontrar uma boa explicação para programadores inexperientes.

 
Durante uma única corrida e visualização, os registos são preenchidos com milhares de entradas deste 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 é preciso esperar longos segundos para que eles apareçam. E só estou interessado no registo, o que eu próprio faço no OnDeinit. Porque é que preciso de forçar sempre que estes registos, que são lidos em casos MUITO raros? Há um item especial do menu no Agent Log Viewer. E a ausência destes registos durante a optimização não faz com que ninguém se sinta incompleto. Então porquê toda esta obscuridade em centenas de megabytes (especialmente se alguma má EA está a tentar abrir um negócio a cada tick, ficando sem suporte no modo de preenchimento)?

É possível separar moscas de costeletas no provador? O mesmo que no terminal: um registo para as impressões da própria EA e um registo do terminal. Cansado de esperar longos segundos enquanto aquelas dezenas de milhares de mensagens desnecessárias no diário de bordo para cada ponto de encomenda passam e é possível ver as últimas linhas de conclusão do backtest.

Já lá vai um longo tempo. Talvez eu não seja o único aborrecido.