资料库: 无需 DLL 的文件映射 - 页 5 123456789101112 新评论 --- 2013.01.06 10:25 #41 baramantan:我不是超级程序员。但我不明白通用性体现在哪里?uchar只适用于正值。最小值为 0,最大值为 255。任何超出 uchar 值的数据都将等于 uchar 的最大值或最小值。根据我所说的,我一开始就问 "如何传递 int 或 double"。我没明白你的意思,头儿。好吧,让我们来参观一下。以char 和uchar 为例,这两个变量的大小都是1 字节。这意味着,通过互相赋值,我们不会 丢失字节,因此也不会 丢失原始数据的值。看看这些表达式uchar u=200; char c=u; u=c; Print(u); c=-100; u=c; c=u; Print(c);long/ulong 和int/uint 也是如此。也就是说,以字节为单位大小相同的整型变量可以互相传递,而不会丢失字节信息。顺便说一下,这意味着虽然 Expert Advisor 接受 ulong 类型的 MAGIC 数字,但您始终可以在程序中以 long(即带符号格式)设置和读取它们。 现在看看<some_type> 和 uchar。 例如 int。这意味着内存中的这 4个 字节可以很容易地表示为 uchar[4] 数组 如果有double ( 8 字节),则可以表示为 uchar[8] 数组 这也适用于字符串的字节 - 在 MQL 中,它是 ushort 数组。 以及相应的,如果您有任何类型的结构,您可以很容易地以 uchar 数组的形式提供任何数据。正是这些关于字节的基本概念被用于 MQL5 版本--内存中的虚拟文件CFastFile。它将任何数据存储在内存的 uchar 数组中。也就是说,如果您不需要与外部程序交换数据。或者您以数据流的形式从其他程序接收数据--例如,读取 Internet 页面,并且这些数据不需要全部保存在光盘上,那么最好使用CFastFile 而不是 Windows 映射。最后,完全整合https://www.mql5.com/zh/articles/364。 MQL5秘笈之:采用关联数组或字典实现快速数据访问 单纯使用 MQL5 语言处理 ZIP MQL5 编程基础:字符串 --- 2013.03.03 13:18 #42 BoraBo:MT5 642 Win7 64 不工作,据我所知,在以下情况后hmem=CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,size+HEAD_MEM,path); // 创建内存对象 我得到错误信息 1400、但 Vista 32 可以正常运行。这是因为 32 和 64 系统的指针大小不同这个库文件是为 32 位终端制作的。但如果使用 64 位终端,则应在所有隐含指针的地方(如 PBYTE、LPVOID 等,以及所有 memcpy 类型)使用 8 字节长类型。 Alexey Klenov 2013.08.27 08:01 #43 但如何连接#include <MemMapLib.mqh> #include <Trade\Trade.mqh> 它给出了'GetLastError' - ambiguous call to overloaded function with the same parameters SymbolInfo.mqh 718 10 'GetLastError' - ambiguous call to overloaded function with the same parameters SymbolInfo.mqh 725 57 而且这两个插件互不影响。 --- 2013.08.27 08:14 #44 olyakish:但如何连接它会发出而这两个内含物互不影响。 尝试使用上下文解析 Alexey Klenov 2013.08.27 08:57 #45 sergeev: 尝试使用上下文分辨率::谢谢我不得不修改标准库。 //+------------------------------------------------------------------+ bool CSymbolInfo::CheckMarketWatch(void) { //--- 检查是否在 MarketWatch 中选择了符号 if(!Select()) { if(::GetLastError()==ERR_MARKET_UNKNOWN_SYMBOL) { printf(__FUNCTION__+": Unknown symbol '%s'",m_name); return(false); } if(!Select(true)) { printf(__FUNCTION__+": Error adding symbol %d",::GetLastError()); return(false); } } //--- 成功 return(true); } //+------------------------------------------------------------------+ 我不认为这是件好事....。 --- 2013.08.27 09:14 #46 olyakish:谢谢。我不得不修改标准库。 我不认为这是件好事你不明白。我告诉过你kernel32::GetLastError,看看我的代码是如何实现的。如果你对这个选项不满意,那就声明从kernel32 导入GetLastError,比如使用 int 参数。 Alexey Klenov 2013.08.27 09:22 #47 sergeev:你不明白。我告诉过你kernel32::GetLastError,看看我的代码是如何实现的。如果这个选项不适合你,那就声明导入kernel32 GetLastError,例如使用 int 参数。也许我没有说清楚。但我们必须要么改变标准库 或者改变你的库。因为这里有一个您的代码示例,其中附带了标准库。//+------------------------------------------------------------------+ //|MemMap Copyright © 2006-2013, FINEXWARE Technologies GmbH | //| 版权所有。 //|www.FINEXWARE.com | //| 编程与开发 - 阿列克谢-谢尔盖耶夫、鲍里斯-格尔沙诺夫 //+------------------------------------------------------------------+ #property copyright "版权 © 2006-2013, FINEXWARE Technologies GmbH" #property link "www.FINEXWARE.com" #property version "1.00" #include <MemMapLib.mqh> #include <Trade\Trade.mqh> //------------------------------------------------------------------ OnStart void OnStart() { CMemMapFile hmem; long err=hmem.Open("Local\\test",111,modeCreate); uchar data[]; StringToCharArray("Hello from MQL5!",data); err=hmem.Write(data,ArraySize(data)); ArrayInitialize(data,0); hmem.Seek(0,SEEK_SET); err=hmem.Read(data,ArraySize(data)); Print(CharArrayToString(data)); hmem.Close(); } 编译时出现了同样的错误。 --- 2013.08.27 10:11 #48 olyakish, 再仔细读读我写给你的信。如果你对上下文不满意,我告诉你的正是我的意思。 "或为您的图书馆改动什么"。 Mykola Demko 2013.08.27 16:15 #49 sergeev:你不明白。我告诉过你kernel32::GetLastError,看看我的代码是如何实现的。如果这个选项不适合你,那就声明从kernel32 GetLastError 导入,例如使用 int 参数。当在代码中调用kernel32::GetLastError 时,编译器会 调用 不带上下文的GetLastError。程序员只需规定调用带上下文的标准 WinAPI 函数的 MQL 类似程序。这样在后续修改中就不会出现问题。因此,如果你修改了标准圣经,它就会被更新,所以你必须再次编辑它。 TheXpert 2013.08.27 16:36 #50 Urain:因此,你修改了标准圣经,它就会更新,但你必须再次编辑它。 标准版就是标准版,所以没什么可做的,没办法。有一个错误 -- 向开发人员报告。别无他法。 123456789101112 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
我不是超级程序员。但我不明白通用性体现在哪里?uchar只适用于正值。最小值为 0,最大值为 255。
任何超出 uchar 值的数据都将等于 uchar 的最大值或最小值。
根据我所说的,我一开始就问 "如何传递 int 或 double"。我没明白你的意思,头儿。
好吧,让我们来参观一下。
以char 和uchar 为例,这两个变量的大小都是1 字节。
这意味着,通过互相赋值,我们不会 丢失字节,因此也不会 丢失原始数据的值。
看看这些表达式
long/ulong 和int/uint 也是如此。
也就是说,以字节为单位大小相同的整型变量可以互相传递,而不会丢失字节信息。
顺便说一下,这意味着虽然 Expert Advisor 接受 ulong 类型的 MAGIC 数字,但您始终可以在程序中以 long(即带符号格式)设置和读取它们。
现在看看<some_type> 和 uchar。
例如 int。这意味着内存中的这 4个 字节可以很容易地表示为 uchar[4] 数组
如果有double ( 8 字节),则可以表示为 uchar[8] 数组
这也适用于字符串的字节 - 在 MQL 中,它是 ushort 数组。
以及相应的,如果您有任何类型的结构,您可以很容易地以 uchar 数组的形式提供任何数据。
正是这些关于字节的基本概念被用于 MQL5 版本--内存中的虚拟文件CFastFile。它将任何数据存储在内存的 uchar 数组中。
也就是说,如果您不需要与外部程序交换数据。或者您以数据流的形式从其他程序接收数据--例如,读取 Internet 页面,并且这些数据不需要全部保存在光盘上,那么最好使用CFastFile 而不是 Windows 映射。
最后,完全整合https://www.mql5.com/zh/articles/364。
MT5 642 Win7 64 不工作,据我所知,在以下情况后
hmem=CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,size+HEAD_MEM,path); // 创建内存对象
我得到错误信息 1400、
但 Vista 32 可以正常运行。
这是因为 32 和 64 系统的指针大小不同
这个库文件是为 32 位终端制作的。
但如果使用 64 位终端,则应在所有隐含指针的地方(如 PBYTE、LPVOID 等,以及所有 memcpy 类型)使用 8 字节长类型。
但如何连接
它给出了
而且这两个插件互不影响。
但如何连接
它会发出
而这两个内含物互不影响。
尝试使用上下文分辨率::
谢谢
我不得不修改标准库。
我不认为这是件好事....。谢谢。
我不得不修改标准库。
我不认为这是件好事你不明白。
我告诉过你kernel32::GetLastError,看看我的代码是如何实现的。
如果你对这个选项不满意,那就声明从kernel32 导入GetLastError,比如使用 int 参数。
你不明白。
我告诉过你kernel32::GetLastError,看看我的代码是如何实现的。
如果这个选项不适合你,那就声明导入kernel32 GetLastError,例如使用 int 参数。
也许我没有说清楚。
但我们必须
因为这里有一个您的代码示例,其中附带了标准库。
编译时出现了同样的错误。
olyakish, 再仔细读读我写给你的信。
如果你对上下文不满意,我告诉你的正是我的意思。
你不明白。
我告诉过你kernel32::GetLastError,看看我的代码是如何实现的。
如果这个选项不适合你,那就声明从kernel32 GetLastError 导入,例如使用 int 参数。
当在代码中调用kernel32::GetLastError 时,编译器会 调用 不带上下文的GetLastError。
程序员只需规定调用带上下文的标准 WinAPI 函数的 MQL 类似程序。这样在后续修改中就不会出现问题。
因此,如果你修改了标准圣经,它就会被更新,所以你必须再次编辑它。
因此,你修改了标准圣经,它就会更新,但你必须再次编辑它。