错误、漏洞、问题 - 页 1963

 
A100:
如果差异很大,那么为什么两种变体在C++中都能正常编译?

在这种情况下,这里根本没有关于C++的权威,因为我的结论是基于逻辑。上面,我用一个解除引用的方法重做了这个例子。

你所要做的就是进行这样的替换

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

如何解读将是完全不同的。你可以要求编译器 "比傻瓜更聪明",并按照它在C++中的方式行事。但这个解决方案确实值得商榷。

也就是说,这样的 "帮助 "可以在编译器中实现,但显示了方法的不同。

 
A100:
是好的。这有什么区别呢?

显然,在简单传递给编译器的过程中,f不被看作是一个指向函数的指针。

 
Комбинатор:

显然,当传递给编译器时,f不会被当作一个函数的指针。

我同意(这很简单,基本上没有什么区别)
 
Комбинатор:

显然,当传递给编译器时,f不会被当作一个函数的指针。

而且它不应该,至少因为有歧义。

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:

而且它不应该,如果只是因为模糊不清的话

在原来的例子中没有这种模糊性...你创造了它...而你用它来解释一切。
 
fxsaber:

而且它不应该,如果只是因为模糊不清的话

在原来的typedef是一个类型的别名,而不是另一个类型,所以对于开发者来说,为什么类型名显示的是一个别名而不是一个类型,这确实是一个大问题。
 

编译时出错

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

如果(1)没有问题,为什么(2)中出现错误,如果(3)没有问题?
 
Комбинатор:
在原来的typedef是一个类型的别名,而不是另一个类型,所以对于开发者来说,为什么类型名显示的是一个别名而不是一个类型,这确实是一个大问题。

我同意。

 

A100:

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

请解释 typeof。我没能为没有经验的程序员找到一个好的解释。

 
在一次运行和可视化过程中,日志中充满了成千上万个这样的条目
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

而且你必须等待很长的时间才能让他们出现。而且我只对日志感兴趣,这是我自己在OnDeinit中做的。为什么我每次都要强制读取这些日志,而这些日志是在非常罕见的情况下读取的?在Agent Log Viewer中有一个特殊的菜单项。而在优化过程中没有这些日志并不会让人觉得不完整。那么,为什么要在几百兆的空间里进行这些干扰呢(特别是如果一些坏的EA试图在每一个刻度 上打开一个交易,得到不支持的填充模式)?

有没有可能在测试器中把苍蝇和肉片分开?与终端相同:EA本身的打印日志和终端的日志。厌倦了等待漫长的几秒钟,而日志中那些数以万计的不必要的信息,每个订单点都会过去,你可以看到回测完成的最后一行。

这已经是一个漫长的过程了。我可能不是唯一恼火的人。