新的MQL4语法 - 页 4

 
正确,除非有很好的理由,我的代码中只有bool, int, double和string。我不会在索引中使用-1,否则我需要对每个接近这个索引的整数进行铸造。
 
RaptorUK:

uchar - 无符号字符,你为什么要在一个循环中使用它呢? 对我来说没有意义 ...... 使用int。 你将与ulongs打交道,这就是一个新的日期时间 ......当你没有考虑到将来的类型转换时,你会得到警告 ......处理这个警告或忽略它。 不要只寄希望于最好的结果,就像你现在所做的那样,学习和理解。

你从stackoverflow上发布的东西对我来说是有意义的,我认为这是很好的建议。

Uchar只是一个例子,因为我的问题与小变量类型的使用有关。Uchar是一个从0到255的8位正值,所以对于0到100的循环,你可以使用8位Uchar而不是32位整数,如果你想的话。
 
SDC:
uchar只是一个例子,因为我的问题与小变量类型的使用有关。 uchar是一个从0到255的1字节正值,所以对于0到100的循环,你可以使用1字节的ugar。
是的,你可以 ......但为什么你要这样做呢?它可以工作,但为什么将一个用于字符值的变量类型用于循环计数器会有逻辑上的意义?

如果你需要保存一个函数 返回的值,并且该函数返回一个Uchar,那么使用一个Uchar变量来保存返回的值......对于原来的mql4来说,这不是一个问题,对于新的mql4来说,这将是一个问题。
 

当我问这个问题时,我不知道我为什么要这样做,这就是为什么我问这个问题。

我不知道一个8位的变量类型是否比32位的处理速度更快,或者是否会更慢,或者一样,我不知道一个8位的值是否会使用更少的内存或磁盘空间。

我想也许一个32位的操作系统可以同时处理四个8位的值,但我不知道。显然不是。这就解释了为什么一个64位的操作系统除了可以访问更多的内存之外,并没有比32位的快多少。我经常想知道这个问题。

 

我有一个问题,我还没有找到解决办法。

如何使用void&?我的意思是,如果我需要向一个DLL发送任何指针。在帮助文件中,有一些函数 使用这个void类型,但如果我把它放在源代码的任何地方,它就不会被编译。我试图使用模板作为变通方法,但模板在#import语句中是被禁止的。

我管理了单一类型的结构,但我无法实现向DLL传递void&数组指针,除非我指定明确的类型。

int  FileReadArray(
   int    file_handle,               // File handle
   void&  array[],                   // Array to record
   int    start=0,                   // start array position to write
   int    count=WHOLE_ARRAY          // count to read
);
 
 

向 DLL 传递结构数组有什么限制吗?

假设 MT4Structure 是一个简单的结构。

导入 kernel32.dll后,单个结构可以正常工作。

bool ReadFile(
    /*_In_         HANDLE*/ int hFile,
    /*_Out_        LPVOID*/ MT4Structure& lpBuffer,
    /*_In_         DWORD*/ uint nNumberOfBytesToRead,
    /*_Out_opt_    LPDWORD*/ uint& lpNumberOfBytesRead[],
    /*_Inout_opt_  LPOVERLAPPED*/int lpOverlapped
);

但我不能接受结构数组。如果把MT4Structure&[] 作为参数发送到这个声明中,编译器将不会编译。

bool ReadFile(int, MT4Structure&[], uint, uint&[],int);
 
Ovo:

在向DLL传递结构数组方面有什么限制吗?

我看不出这样做有什么问题。

struct TestStruct {
   int Integer;
   uchar Byte;
   double Real;
};

#import "ExampleDllWhichReceivesStructureArray.dll"
   void Test(TestStruct &[]);
#import 

它可以像预期的那样工作(只要你允许MT4和DLL中不同的默认结构对齐方式)。

(BTW,我实际上不确定MQL4 bool现在的内部表示是什么,但我更愿意将Win32函数 声明为返回int。Win32函数返回一个BOOL,而不是C++的bool。BOOL是Windows的一个宏,用于4字节的整数,其值是1/0,而C++的bool是一个单字节的。如果您告诉MT4期望从函数中得到一个单字节的返回值,而实际上它们返回的是四个字节,那么您可能--尽管这不太可能--最终导致堆栈损坏)。

 
Ovo:

如何使用void&?我是说,如果我需要向DLL发送任何指针。

我不太清楚你的问题是什么。例如,Win32 API的文档使用void*表示 "这接受任何类型的指向任何东西的指针;Win32函数 并不关心你的内存块是什么"。

 
gchrmt4:

我不太清楚你的问题是什么。例如,Win32 API的文档使用void*来表示 "这接受任何类型的指向任何东西的指针;Win32函数并不关心你的内存块是什么"。


正是如此。但在MQL4中似乎不太可能,而且在#import块中使用模板是不允许的。因此,使用winapi的附加结构 就变成了每次需要新类型时都要手动更新#import的声明。这让我感到很不舒服,因为我的目的是在一个地方管理导入。
 
Ovo:

是的。但是在MQL4中似乎不太可能,而且在#import块中不允许使用模板。因此,使用winapi的附加结构就变成了每次需要新类型时都要手动更新#import的声明。这让我感到很不舒服。
我仍然不确定我是否理解,但是...我不认为你可以把MQL4导入 声明为void*。你必须在导入中使用一个特定的数据类型,然后你只能用这个数据类型来使用DLL导入。如果你想用不同的数据类型来使用同一个DLL函数,那么你就有问题了,除非有一个变通的办法,比如https://www.mql5.com/en/forum/148934