错误、漏洞、问题 - 页 2720

 
在编译MT5代码(build 2380)时,再次出现了无用的警告问题。
请考虑为开发者禁用不必要的编译器警告
declaration of 'm_range' hides member   
   in template 'NodeArray<NodeArray<TailArray<int>>>' specified with [T=NodeArray<TailArray<int>>]      
   see previous declaration of 'm_range'        
declaration of 'm_range' hides member
   in template 'NodeArray<NodeArray<NodeArray<TailArray<int>>>>' specified with [T=NodeArray<NodeArray<TailArray<int>>>]
   see previous declaration of 'm_range'

源代码,多维数组原型(C++在线:https://onlinegdb.com/Hk7QjyRdL)
#define  PRINT(x) ; Print(#x, ":", string(x))

template<typename T>
class TailArray{
protected:
   int m_index;
   T data[];
   
protected:
   TailArray(){}   
public:     
   TailArray(int size){
      ArrayResize(data, size);
      m_index = 0;
   };
   
   T value(){
      int index = m_index;
      m_index = 0;
      return data[index];
   }
   const T operator=(const T value){
      data[m_index] = (T)value;
      m_index = 0;
      return value;
   };
};

template<typename T>
class NodeArray : public T{
protected:
   int m_range;
   
protected:
   NodeArray(){}   
public:     
   NodeArray(const NodeArray &src){ this = src;}
   template<typename T_int> NodeArray(T_int count, T_int r1) : T(count * r1), m_range(r1){}
   template<typename T_int> NodeArray(T_int count, T_int r1, T_int r2) : T(count * r1, r2), m_range(r1){}
   template<typename T_int> NodeArray(T_int count, T_int r1, T_int r2, T_int r3) : T(count * r1, r2, r3), m_range(r1){}
   
   T* operator[](int index){
      this.m_index = this.m_index * this.m_range + index;
      return &this;
   }
};


#define  MultiArray(type, size) MultiArray##size(type)
#define  MultiArray2(type) NodeArray<NodeArray<TailArray<type>>>
#define  MultiArray3(type) NodeArray<NodeArray<NodeArray<TailArray<type>>>>


template<typename T>
class MultiArrayCreate{
public:
   static MultiArray(T, 2) Size(int range_1, int range_2){
      return (MultiArray(T, 2)(range_1, range_2, 1));
   }
   static MultiArray(T, 3) Size(int range_1, int range_2, int range_3){  
      return (MultiArray(T, 3)(range_1, range_2, range_3, 1));
   }
};


void OnStart(){
   MultiArray(int, 2) arr_2 = MultiArrayCreate<int>::Size(4, 4);
   MultiArray(int, 3) arr_3 = MultiArrayCreate<int>::Size(4, 4, 4);
   
   arr_2[0][0] = 2233;
   arr_3[3][3][3] = 4455;
   PRINT(arr_2[0][0].value());
   PRINT(arr_3[3][3][3].value());
}
 

大家下午好!

请告诉我如何在设计中的脚本描述中插入图片,并随后在CodeBase中发布?

由于某些原因,我只能从Youtube上插入视频......,但没有插入图片 的图标!:(

提前感谢!:)

 
gsl17:

大家下午好!

请告诉我如何在设计中的脚本描述中插入图片,并随后在CodeBase中发布?

由于某些原因,我只能从Youtube上插入视频......,但没有插入图片 的图标!:(

提前感谢!:)

插入图片按钮钮扣插图 ,用户可以从一些最低等级开始使用。你显然没有足够的等级来使用钮扣插图 按钮。

 
Vladimir Karputov:

用户可以从一定的最低等级开始使用插入图片的按钮。你显然没有足够的评级来使用这个按钮。

谢谢你的澄清。

这真是太糟糕了...

P.S. 是的,这确实是我第一次在CodeBase上挂出一个脚本。

 
Bild 2390 mt 5剖析器 在历史上的作用是真实的数据,没有。
 

模板函数/类缓存操作中的缺陷。
( 由MT5(build 2390)修复)***(up) 未定义行为,你创建了一个内部类型为 "C "的复杂包装对象,几次后发现它是一个完全不同的数据类型,也许是 "B",也许是 "int",随你怎么想。
( 由MT5(build 2390)修复)* 编译错误,传递函数指针作为const ref模板参数的错误。
( 由MT5(build 2390)修复)* 编译错误,B<int>对象可以在B<void*>类对象之后创建,但如果在之前创建则会发生编译错误。


模板功能/类工作中的缺陷。
( 由MT5(build 2390)修复)**(up) 编译错误,试图为模板函数的模板参数访问内部类时出现错误。
( 由MT5(build 2390)修复)**(up) 编译错误,模板函数的错误,在显式类型转换 中传递的指针表现得像一个类,否则像一个指针。
( MT5(build 2390)没有修复)*** 编译错误,对不适当的输出警告的主要诉求是 "被废弃的行为,隐藏的方法调用将在未来的MQL编译器版本中被禁用"。 目前的实现是向麻雀开炮。
( MT5(build 2390)没有修复)** 编译错误,该错误涉及模板函数的返回值,当返回值是模板类中的内部类,其参数类型由模板函数的参数类型设置。
( MT5(build 2390)没有修复)** 编译错误,当继承类和内部类中使用相同的类名时,调用基类的模板构造器中存在命名空间和范围错误。
( MT5(build 2390)没有修复)* 编译错误,当从重载的非模板函数中调用具有明确参数类型的模板函数时出现错误。
( MT5(build 2390)没有修复) 编译错误,内部类定义的错误 - 在定义基类时没有引用全局命名空间。
( 由MT5(build 2390)修复)** 编译错误,使用内部类时模板类代码生成的错误。
( 由MT5(build 2390)修复)** 编译错误,模板方法/类生成的错误,模板参数的自动替换过程超出了主程序代码的范围。
( 由MT5(build 2390)修复)* 编译错误,当模板类作为模板方法的返回值时,没有模板类代码生成的错误。
( 由MT5(build 2390)修复)* 编译错误,错误,当内部结构被传递给模板函数时,接收的数据类型 不能作为模板类中另一个内部结构的基础数据类型使用。
( 由MT5(build 2390)修复)* 编译错误,在模板类内声明模板函数时,没有对重复使用的模板类型名称进行检查,这导致了意外行为。
( 由MT5(build 2390)修复) 编译错误,当模板类/结构是对象时,与返回 "原地创建 "对象有关的多个缺陷。
(由MT5(build 2368)修复)*(这不是一个bug,是一个特性)在基类构造函数中,在将基类对象的指针转换为父类的指针时,不可能进行显式类型转换。
(未 被MT5(build 2390)修复)(新)当模板参数作为基类时,在模板类中使用默认的访问修改器进行继承时,编译错误。
( MT5(build 2390)没有修复)*(新)编译错误,当通过显式基类引用调用一个赋值语句时。问题发生在模板类中,模板参数作为基类的作用。


与MQL与C++中的重载函数的调用优先级不匹配有关的缺陷。
( 由MT5(build 2390)修复)**(up) 当重载模板函数的第一个使用完全专业化的模板基类,第二个使用非专业化的模板基类时,编译错误。
( MT5(build 2390)没有修复)** 编译错误,在为一个模板函数生成代码时发生了编译错误,尽管事实上有一个重载的模板函数,对所传递的参数有一个合适的签名。
( MT5(build 2390)没有修复)* 编译错误,当调用具有不同数量模板参数的重载模板函数时,"对重载函数的模糊调用"。
( 由MT5(build 2390)修复)(由MT5(build 2390)修正)。 **(up) 编译错误,重载模板函数的调用优先级实际上取决于模板参数的类型,理论上不应该影响编译的结果。
( 由MT5(build 2390)修复)*** 当继承类A <= B <= C <= D并实现两个重载函数,例如一个来自参数A*,一个来自参数B*,然后在MQL中把一个C*或D*对象传入这样的函数时,会导致编译错误。
( 由MT5(build 2390)修复)(由MT5(build 2390)修复。 ** 运行时,调用重载模板函数的优先级不一致。
( 由MT5(build 2390)修复)*** Runtime,当为一个指针类型的参数选择一个合适的重载函数时,类型转换为指针到父类而不是基类的函数会变得更优先。
( MT5(build 2390)没有修复)*** (new) 编译错误,重载模板函数调用优先。
( MT5(build 2390)没有修复)** (新)编译错误,尽管有一个匹配的签名重载模板函数,但 为数据类型为颜色的参数调用一个函数时,使用了隐式类型对话。
( MT5(build 2390)没有修复)*(新)编译错误,尽管在调用重载模板函数时有明确的专业化,但模板函数还是被默认调用,这导致了堆栈溢出。
( MT5(build 2390)没有修复)* (新)编译错误,当一个函数通过其指针被调用时,当使用一个函数的指针数组时,编译错误


与MetaEditor有关的缺陷。
( ME5(build 2390)没有修复)***(新)调试器,静态 结构方法 中的断点崩溃导致MT终端挂起。
( ME5(build 2390)中没有修复)** (new) 编译时,编译错误的描述不能容纳在256个字符的限制内而被切断,因此无法了解哪个数据类型的错误发生,因为必要的部分被切断了。
( ME5(build 2390)中没有修复)**(新)调试器,StepInto(F11)和设置断点不起作用。
( ME5(build 2390)中没有修复)**(新)调试器,在触发断点后,不是按(F5)继续执行代码,而是实际上再次触发同一断点而不执行任何代码。
( ME5(build 2390)中没有修复)*(新)编译,错误描述和参数信息中的函数模板参数签名不正确。
( ME5(build 2390)中没有修复)* (新)MetaEditor,替换(Strl+H)功能对包括 "在选择 "和 "后退方向 "的情况下不起作用,当应用程序的必要部分被选中,而不是整个代码。


与函数执行缓慢有关的缺陷,代码优化器工作。
( 由MT5(build 2390)修复)**(up) 运行时,使用ArrayResize一次向数组中添加一个元素时,尽管为它们保留了内存,但仍有很大的开销,例如对于结构来说,慢了7倍之多。


建议。
(new) - 在ME中加入按当前项目搜索/替换的功能,因为在重构过程中,逐个文件搜索出现的情况在某种程度上并不理想。
Reference(新)--在ME编译时,用源文件的适当信息填充File、Line、Column等空列,并从这些文件中进行收录。
link- 关于在类中静态方法的intellisense工作的基础上,引入命名空间功能的intellisense支持。
link- 提供将字面意思和临时变量作为const ref函数参数传递的能力。
link- 当在项目标签中移动 项目文件 时,对于被移动的文件,如果是在ME标签中打开的,要自动更新其位置路径。
link- 在MQL中引入typedef声明功能。
链接- 关于提供强制生成默认复制构造函数和赋值运算符的可能性。

 
很遗憾,ME在编译时不显示可插拔的mqh的路径,只显示名称。
 
当在 "订单和交易 "模式下显示交易历史时,不可能按列排序。正因为如此,一些刚刚发生的交易并没有进入名单的末尾,而是进入中间。
 
fxsaber:

一个简单的例子。你想拥有一个有指定期限的MAU数组。

每个MAP都是一个相同类型的对象。很明显,MASK是由句号明确规定的。因此,使其成为常态是合乎逻辑的。


其他语言只是做一个指针数组。在MQL中,我们没有这种自由。

这将是不合逻辑的。如果你不打算改变它,这并不意味着你必须让它变得不变。让变量成为私有变量就足够了。

如果你从中得到了什么,那是合乎逻辑的,但你只是给自己制造了一个问题
Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2020.04.21
  • www.mql5.com
Общее обсуждение: Ошибки, баги, вопросы
 
Sergey Dzyublik:

你知道MQL优化器和编译器是如何设计的吗?
你怎么能这么肯定简单类型的常量字段不会被用于此目的?

优化器与此毫无关系。