错误、漏洞、问题 - 页 2746

 
Koldun Zloy:

不,它在编译时还不知道。

那么当SymbolInfoTick被调用 数百亿次时,它如何帮助避免大量的检查?

 
fxsaber:

那么当SymbolInfoTick被调用 数百亿次时,它如何帮助避免大量的检查?

它没有。它只是有助于不不必要地复制字符串本身。

 
Koldun Zloy:

没有。它只是有助于不不必要地复制字符串本身。

那么,如果想从优化器中获得更多的效率,显然SymbolInfo函数 的字符串引用方案是正确的。

 

我的调试器拒绝在我的一个项目中工作。此外,它的行为也很难预测。有时它就是拒绝进入断点。它还拒绝进入一些功能。起初我以为原因是更新(也许是调试时出了问题)。但在其他更简单的程序中,一切似乎都在运作。不过我没怎么检查,因为我在做我的主要项目。它相当复杂,只包括我自己设计的15个模块(我没有计算标准模块的数量)。主模块最多包含2000行。我想也许这都是关于项目的复杂性......另外,在一些地方,我使用宏来处理重复的代码片段。我还使用了标准的UI元素,如CAppDialog、CCheckGroup、CComboBox、CButton等,我根据我的程序功能重新编写了这些元素。也许因为它们的存在,调试不成功......例如,我专门写的CCheckGroup::itemCheckState(const string item)方法就没有被调试出来。该方法找到复选框的项目并检查它是否被选中(其状态)。

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CCheckGroup::itemCheckState(const string item) {
  int total = m_strings.Total();
  
  if(total != m_states.Total())
    return -1;
    
  int i = 0;
  for(; i < total; i++) {
    if(m_strings.At(i) == item)
      return m_states.At(i);
  }
  
  return -1;
}

这就是我最终得到的用户界面。

介面

一些用户界面元素被暂时分类。这里有一个分支,我描述了我如何覆盖CAppDialog元素的Show()和Hide()方法:https://www.mql5.com/ru/forum/338301 编译器在那一刻抱怨了,发生了一个关键错误。

最后,该项目编译正常,编译器没有产生任何错误。但调试失败,只是没有显示一些代码片段、函数、方法等的执行。

据我所知,这可能有几个原因。

  1. 项目的复杂代码,使用宏
  2. 使用标准UI元素的复杂代码,如CAppDialog、CCheckGroup、CComboBox、CButton(我还为它们写了新的方法并重新定义了一些现有的方法)。
  3. 与新版本有关的调试器错误(可能,不太可能)。

建设和系统信息。

2020.05.21 09:35:09.325 Terminal MetaTrader 5 x64 build 2433 started for MetaQuotes Software Corp.

2020.05.21 09:35:09.326 终端 Windows 10 build 14393, Intel Core i5-5200U @ 2.20GHz, 2 / 3 Gb内存, 61 / 380 Gb磁盘, IE 11, UAC, GMT+2

有没有人在调试器方面遇到过类似的问题,可能是什么原因?
 
fxsaber:

那么很明显,如果想要从优化器中获得更多的效率,那么SymbolInfo函数的字符串引用解决方案是正确的。

反正所有的东西都是通过引用传递的。 区别只在古老的MQL4中。而且在读取字符串时没有检查。
 
Alexey Navoykov:
这个链接没有任何意义,开发者是这么说的。 一切都由链接原封不动地传递。 唯一的区别是在古代的MQL4。而且在读取字符串时没有任何检查。

做出这样的声明才是累人的。

int f1( string Str )
{
  return((Str += Str) == Str);
}

int f2( string &Str )
{
  return((Str += Str) == Str);
}

int Bench1( const int Amount = 1 e8 )
{
  int Res = 0;
  string Str = NULL;
  
  for (int i = 0; i < Amount; i++)
    Res += f1(Str);
    
  Print(Res);
    
  return(Res);    
}

int Bench2( const int Amount = 1 e8 )
{
  int Res = 0;
  string Str = NULL;
  
  for (int i = 0; i < Amount; i++)
    Res += f2(Str);

  Print(Res);
    
  return(Res);    
}

void OnStart()
{
  BENCH(Bench1())
  BENCH(Bench2())

  BENCH(Bench1())
  BENCH(Bench2())
}


        100000000
        Time[Bench1()] = 727585
        100000000
        Time[Bench2()] = 657464
        100000000
        Time[Bench1()] = 794205
        100000000
        Time[Bench2()] = 670440
 
fxsaber:

做出这样的声明只会让人厌烦。


也许这更容易写。

int f1( string Str )
{
  return(Str == NULL || Str == "");
}

?...

为什么要喝这样的东西?

int f1( string Str )
{
  return((Str += Str) == Str);
}
 
Mihail Matkovskij:

这可能更容易写。

有一种不同的讨论。

 
fxsaber:

做出这样的声明才是累人的。

为了避免不被证实,请给我一个字符串不改变 的基准。
 
TheXpert:
为了避免不被证实,请给我一个测试的基准,即字符串不改变 的测试。
int f1( const string Str )
{
  return(Str + "1" != Str);
}

int f2( const string &Str )
{
  return(Str + "1" != Str);
}
        10000000
        Time[Bench1()] = 334596
        10000000
        Time[Bench2()] = 338559
        10000000
        Time[Bench1()] = 384711
        10000000
        Time[Bench2()] = 344346