新的MQL4语法 - 页 5

 
gchrmt4:
我仍然不确定我是否理解,但是...我不认为你可以把MQL4导入 声明为void*。你必须在导入中使用一个特定的数据类型,然后你只能用这个数据类型来使用DLL导入。如果你想用不同的数据类型来使用同一个DLL函数,那么你就有问题了,除非有一个变通的办法,比如https://www.mql5.com/en/forum/148934


事实上,我正在使用一个变通方法,但它很弱--将任何类型的数据包装成一个通用结构。接受通用结构作为参数可能会在未来的任何版本中发生变化。但这对数组不起作用。

 
Ovo:


事实上,我正在使用一种变通方法,但它很弱--将任何类型的文件包装成一个通用结构。接受通用结构作为参数可能会在未来的版本中发生变化,但这对数组不起作用。

...看来我错了。我们都忘记了,MQL4现在有函数 重载,因此可以做这样的事情。

#import "AnyDll.dll"
   void Test(TestStruct &[]);
   void Test(int &[]);
#import 
 
gchrmt4:

...看来,我错了。我们都忘记了,MQL4现在有函数重载,因此有可能做这样的事情。


当然,这是我从一开始就谈到的 :)

到目前为止,我的导入 看起来像。

bool ReadFile(int, MT4Structure&, uint, uint&[],int); // wrapper for all simple types / structures
bool ReadFile(int, double&[], uint, uint&[],int);
bool ReadFile(int, int&[], uint, uint&[],int);
bool ReadFile(int, uchar&[], uint, uint&[],int);
bool ReadFile(int, MT4Structure&[], uint, uint&[],int); // this does not work

我想知道这个清单(单一的进口)在一年内会变得多长......

 

我还注意到,在编译依赖包含文件的代码时,有一点不一致的地方。

如果两个或更多的项目 共享同一个包含文件,而包含文件被修改了,那么第一个项目会检测到它并重新编译,而下一个项目则不会。但这并不是什么严重的问题(我们可以随时删除所有的ex4)。

 

我只需要一个快速的答案,我今天太累了,无法搜索。是否有可能在scope2 到达区块边界之前将其销毁?我认为不可能,但最好还是问一下。

{
   MT4Scope* scope = new MT4Scope(_Symbol, 222);
   MT4Scope scope2(_Symbol, 223);
   delete scope; // calls destructor
   // here I want to call scope2 destructor, but I do not know how

   // some additional code
}
 
Ovo: 我只需要一个快速的答案,我今天太累了,无法搜索。是否有可能在scope2 到达区块边界之前将其销毁?我认为不可能,但最好还是问一下。
没有。
 
ubzen:
没有。


谢谢你。
 

为什么 "ArrayMaximum "在MT4 600+和MT5之间不同? 我认为将MT4语法迁移到MT5语法的原因是为了方便开发可在两者上运行的应用程序。


MT4

int  ArrayMaximum(
   const void&   array[],             // array for search
   int           count=WHOLE_ARRAY,   // number of checked elements
   int           start=0              // index to start checking with
   );


MT5

int  ArrayMaximum(
   const void&   array[],             // array for search
   int           start=0,             // index to start checking with
   int           count=WHOLE_ARRAY    // number of checked elements
   );
 
dlewisfl:

为什么 "ArrayMaximum "在MT4 600+和MT5之间不同? 我认为将MT4语法迁移到MT5语法的原因是为了方便开发可在两者上运行的应用程序。

可能是为了保持一些向后的兼容性 . . .
 
dlewisfl: 为什么 "ArrayMaximum "在MT4 600+和MT5之间不同? 我认为将MT4语法迁移到MT5语法的原因是为了方便开发可在两者上运行的应用程序。
不太好。那就自己做吧。
int iArrayMaximum(const void& array[], int iLimit=WHOLE_ARRAY, int iBeg=0){
   if(iLimit == WHOLE_ARRAY) iLimit = ArraySize(array);
#ifdef __MQL4__
   return( ArrayMaximum(array, iLimit - iBeg + 1, iBeg) );
#else
   return( ArrayMaximum(array, iBeg, iLimit - iBeg + 1) );
#endif
}
问题解决了。