错误、漏洞、问题 - 页 713

 
speedy:

编译按钮永远消失了(你必须重新加载编辑器才能找回来)。

嗯,不完全是...:) 我设法把它弄回来了 :)

你必须注释掉递归部分,然后按下调试编译按钮来做。

 
speedy:

1. 将内部的非基类元素 "暴露 "在外面是不安全的(在这个例子中,不是属性本身,而只是一个数组元素!)此外,不可能改变其值。

此外,它与面向对象编程的 "精神 "相抵触:所有与对象的数据有关的工作都应该在对象内部进行,由它自己的方法来完成...。

3.只使用Setter来处理数据属性如何?

4.代码将从可读性中受益。

5.最终,这种带有l值索引器的 "简单性 "将使包括你在内的任何人都无法理解这段代码的工作原理......

6.你会花更多的时间去寻找错误,而不是写Setter。

那是什么,黑色幽默?

1.对不起,--无稽之谈。 我知道偏执狂在这里很流行,是 "为什么你不应该那样做 "的废柴论据。 我不认为有任何危险。仔细看了一下,如果有的话。 任何名字,毕竟是一个参考。 索引只是名字概念的一个延伸。仅此而已,为了安全起见,让我们完全禁止命名。 链接是非常危险的,不是吗?

2.这种逻辑与C++、C#、Delphi和几十种不太流行的语言的面向对象的编程精神发生了激烈的矛盾,在这些语言中,索引器在右边和左边都工作得相当好。 此外,由于某些原因,它并不与常识和我的精神相矛盾。

索引器是为了与外部环境进行交流。 它们的功能正是接口的功能。 我可以封装和隐藏任何东西,但我需要索引来操作对象的数组。事实上,所有数组都是以某种方式排列的。例如,常规的动态mql数组。让我们用SetArrayValue(array, i, j, value)这样的函数来代替它们;这将同时提高可读性。而调试也将变得更加容易。呃...

3.做一个普通的索引器怎么样? 女仆当然很酷,但女王还是更好。

4.这是我真正开始失去理智的地方。 这是不可以读的吗?

  t[i]=i*i;

这更具有可读性,不是吗?

  t.setDataElement(i, i*i);

酷,我想我要去接受治疗了。

5.酷。

6.我哭了。


 

该指标在构建630时停止编译。

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
 //код
 for(int i=limit; i<rates_total && !IsStopped(); i++)
  {
   if()
    {
     //~400 стр. кода
     // i используется много раз
     // тут же определяется RT=true или false
    }
   if(RT)
    {
     double p=close[i];  // 'i' - undeclared identifier
    }
  }
 return(rates_total);  // 'rates_total' - undeclared identifier
}

ci 错误可以通过在for的 前面加一个广告来消除。

int i;
for(i=limit; i<rates_total && !IsStopped(); i++)
{

}

如何处理'rate_total'--未声明的标识符?

在Win7 x64和XP x32上也一样。

 

你能告诉我吗?MathMin()和MathMax()是作为函数(通过堆栈传递参数)还是作为宏替换(内联)实现的?根据参考书,它们的功能 是。

Документация по MQL5: Основы языка / Функции / Передача параметров
Документация по MQL5: Основы языка / Функции / Передача параметров
  • www.mql5.com
Основы языка / Функции / Передача параметров - Документация по MQL5
 
kPVT:

该指标在构建630时停止编译。

ci 错误可以通过在for的 前面加一个广告来消除。

如何处理'rate_total'--未声明的标识符?

在Win7 x64和XP x32上也一样。

你的代码中某处一定有错误。如果你声明了变量limit、RT和条件if(),那么你提交的程序块在编译时不会出现错误。
 
Rosh:
你的代码中的某个地方显然有错误。如果你声明了变量limit、RT并设置了条件if(),那么提交的程序块在编译时不会出现错误。

自然,我没有给出代码,但有一个大致的结构。

在619版本中,该指标编译后工作正常。

630时,它产生了上述错误。

代码是100%不变的。编译器的工作方式显然已经改变。

 
写信给服务台 并附上源代码。这将有助于开发人员找到原因并加以修复。
 
speedy:

错误?

下面的代码在编译器中产生了一种永久的循环。点击取消

不会立即起作用,但当它起作用时,就会重新获得对编辑器的控制。

取消按钮本身并没有消失,但它也无法访问。

编译按钮永远消失了(你必须重新加载编辑器才能找回来)。

谢谢你的帖子,编译器错误已被修复。
 
victorg:

请告知。MathMin()和MathMax()是作为函数(通过堆栈传递参数)还是作为宏置换(内联)实现的?根据参考书,它们是功能

当然是函数,因为在编译的时候,参数的值是未知的。IMHO内联和宏是不同的。

P.S: 内联或不内联,我不能说。

 
220Volt:

当然是函数,因为在编译的时候,参数的值是未知的。IMHO内联和宏是不同的。

P.S:他们是否是内联的,我不能说。

宏和内联函数确实是不同的东西。但这不是我的意思。下面是一个例子,在编译的时候,参数的值是未知的

#define  min(a,b) (((a)<(b))?(a):(b))
double func(a,b)
  {
  c=min(a,b);   // 1-й вариант
  c=fmin(a,b);  // 2-й вариант
  return(c);
  }

在第一种情况下,代码必须粘贴到当前函数中(我猜),在第二种情况下,函数被调用,参数 通过堆栈传递(我猜)。但出于优化的目的,编译器实际上也可以通过替换来实现第二个变体。是这样吗 我不知道。这就是为什么我问。

Документация по MQL5: Основы языка / Функции / Передача параметров
Документация по MQL5: Основы языка / Функции / Передача параметров
  • www.mql5.com
Основы языка / Функции / Передача параметров - Документация по MQL5
原因: