资料库: 无需 DLL 的文件映射 - 页 9 123456789101112 新评论 fxsaber 2017.04.03 16:07 #81 感谢作者提供该库!我制作了用于传输任何数据的函数。下面的脚本展示了它们在刻度线示例中的工作情况#include <MemMapLib.mqh> #include <TypeToBytes.mqh> // 为数据分配指定长度的内存 template <typename T> bool GetFileMemory( CMemMapFile* &FileMemory, const int Amount, const string FileName = "Local\\test" ) { FileMemory = new CMemMapFile; return(FileMemory.Open(FileName, sizeof(T) * Amount + sizeof(int) + HEAD_MEM, modeCreate) == 0); } // 将数据写入内存 template <typename T> void DataSave( CMemMapFile* FileMemory, const T &Data[], const bool FromBegin = true ) { const int Size = ArraySize(Data) * sizeof(T); uchar Bytes[]; _ArrayCopy(Bytes, _R(Size).Bytes); // 记录数量 _ArrayCopy(Bytes, _R(Data).Bytes, sizeof(int)); // 记录数据 if (FromBegin) FileMemory.Seek(0, SEEK_SET); FileMemory.Write(Bytes, ArraySize(Bytes)); // 将所有内容转入内存 return; } // 从内存中读取数据 template <typename T> int DataLoad( CMemMapFile* FileMemory, T &Data[], const bool FromBegin = true ) { if (FromBegin) FileMemory.Seek(0, SEEK_SET); uchar Bytes[]; FileMemory.Read(Bytes, sizeof(int)); // 从内存中读取数据量 FileMemory.Read(Bytes, _R(Bytes)[0]); // 获取数据本身 _ArrayCopy(Data, Bytes); // 将数据转入数组 return(ArraySize(Data)); } #define AMOUNT 1000 #define TOSTRING(A) #A + " = " + (string)(A) + " " // 标记传输示例 void OnStart() { CMemMapFile* FileMemory; if (GetFileMemory<MqlTick>(FileMemory, AMOUNT)) { MqlTick Ticks4Save[]; CopyTicks(_Symbol, Ticks4Save, COPY_TICKS_INFO, 0, AMOUNT); DataSave(FileMemory, Ticks4Save); MqlTick Ticks4Load[]; if (DataLoad(FileMemory, Ticks4Load) > 0) Print(TOSTRING((_R(Ticks4Save) == Ticks4Load)) + TOSTRING(ArraySize(Ticks4Save)) + TOSTRING(ArraySize(Ticks4Load))); FileMemory.Close(); } delete FileMemory; }结果(_R(Ticks4Save)==Ticks4Load) = true ArraySize(Ticks4Save) = 1000 ArraySize(Ticks4Load) = 1000 --- 2017.05.01 13:02 #82 版本更新1.02 - 更改了将结构复制到联合体的功能 附加的文件: MemMapLib.mqh 31 kb Rashid Umarov 2017.05.01 16:44 #83 o_o:版本更新1.02 - 更改了将结构复制到联合体的做法 替换文件并发布 Denis Lysenko 2017.09.13 23:20 #84 o_o: 也许您没有考虑到,在类中,第一个字节是分配给头的,文件大小存储在头中?能告诉我这样做对不对?我想写入/读取双倍数据。由于 mql4 不知道如何将结构复制到其他结构中,所以我采用了其他方法。在你的脚本中没有这种类型参数的调用,所以我添加了它们: // 64 long memcpy(double &Destination[], uchar &Source[], int Length); long memcpy(uchar &Destination[], double &Source[], int Length);这样代码就正常工作了,没有出错:void OnStart() { CMemMapFile hmem; long err=hmem.Open("Local\\test",111,modeCreate); double src[5]={1.2,3.4,5.6,7.8,9.0}; int cnt=sizeof(double)*ArraySize(src); uchar data[5*8]; memcpy(data,src,cnt); err=hmem.Write(data,ArraySize(data)); ArrayInitialize(data,0); hmem.Seek(0,SEEK_SET); err=hmem.Read(data,ArraySize(data)); ArrayInitialize(src,0); memcpy(src,data,cnt); hmem.Close(); }1.我能用memcpy 来处理此类参数类型吗?如果"全错了,我们再来一遍",那么如何写入/读取双倍数据?2.这对 32 位有效吗? --- 2017.09.14 09:28 #85 Denis Lysenko: 我想写入/读取双倍数据。由于 mql4 不知道如何将结构复制到其他结构中,所以我采用了其他方法。现在你可以借助 union 复制结构了1.我可以使用 memcpy 来处理这类参数吗?2.这对 32 位有效吗?可以 Denis Lysenko 2017.09.14 19:02 #86 Customer: 如果最后一笔交易亏损,他们会提高手数每次 2 笔交易,但开仓和平仓,例如开仓 8.00 英镑/美元,平仓 16.00 英镑/美元 Denis Lysenko 2017.09.16 21:55 #87 o_o:现在可以使用联合体复制结构由于某些原因,前面的注释被删除了。 union dbl_u { double value; }; union uchar_u { uchar value[8]; }; dbl_u dbl; uchar_u chr; dbl = chr; 返回:'=' - 非法操作使用 --- 2017.09.17 23:35 #88 Denis Lysenko: 由于某些原因,之前的注释被删除了。它给出了:'=' - 非法操作使用 请阅读手册。工会不使用这种方式。 Иван 2017.09.20 10:24 #89 请帮我弄明白为什么下面的代码不起作用:#include <MemMapLib.mqh> //------------------------------------------------------------------ OnStart void OnStart() { CMemMapFile hmem; long err=hmem.Open("Local\\test",111,modeCreate); uchar data[],data2[]; StringToCharArray("0.12243;0.44565;1.32452",data); err=hmem.Write(data,ArraySize(data)); ArrayResize(data2,ArraySize(data)); ArrayInitialize(data2,0); hmem.Seek(0,SEEK_SET); err=hmem.Read(data2,ArraySize(data2)); Print("Read result=",CharArrayToString(data2)); hmem.Close(); Print("New cycle of open memory file"); err=hmem.Open("Local\\test",111,modeOpen); Print("err1=",err); ArrayInitialize(data2,0); hmem.Seek(0,SEEK_SET); err=hmem.Read(data2,ArraySize(data2)); Print("err2=",err); Print("after reading data2=",CharArrayToString(data2)); hmem.Close(); }代码的结果:2017.09.20 11:13:54.981 memmap_MY_02_question EURUSD,H1: after reading data2= 2017.09.20 11:13:54.981 memmap_MY_02_question EURUSD,H1: err2=-1 2017.09.20 11:13:54.981 memmap_MY_02_question EURUSD,H1: err1=0 2017.09.20 11:13:54.981 memmap_MY_02_question EURUSD,H1: New cycle of open memory file 2017.09.20 11:13:54.981 memmap_MY_02_question EURUSD,H1: Read result=0.12243;0.44565;1.32452 为什么重新打开文件后无法读取内存中的内容?我在 MT4 终端运行脚本。 --- 2017.09.20 11:00 #90 Иван:重新打开内存中的文件后,为什么无法读取其中的内容?至少你不会在重启计算机后试图读取内存中的文件... 123456789101112 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
感谢作者提供该库!
我制作了用于传输任何数据的函数。下面的脚本展示了它们在刻度线示例中的工作情况
结果
版本更新
1.02 - 更改了将结构复制到联合体的功能
版本更新
1.02 - 更改了将结构复制到联合体的做法
也许您没有考虑到,在类中,第一个字节是分配给头的,文件大小存储在头中?
能告诉我这样做对不对?
我想写入/读取双倍数据。由于 mql4 不知道如何将结构复制到其他结构中,所以我采用了其他方法。
在你的脚本中没有这种类型参数的调用,所以我添加了它们:
这样代码就正常工作了,没有出错:
1.我能用memcpy 来处理此类参数类型吗?如果"全错了,我们再来一遍",那么如何写入/读取双倍数据?
2.这对 32 位有效吗?
我想写入/读取双倍数据。由于 mql4 不知道如何将结构复制到其他结构中,所以我采用了其他方法。
现在你可以借助 union 复制结构了
2.这对 32 位有效吗?
可以
如果最后一笔交易亏损,他们会提高手数
每次 2 笔交易,但开仓和平仓,例如开仓 8.00 英镑/美元,平仓 16.00 英镑/美元
现在可以使用联合体复制结构
由于某些原因,前面的注释被删除了。
由于某些原因,之前的注释被删除了。
请帮我弄明白为什么下面的代码不起作用:
代码的结果:
为什么重新打开文件后无法读取内存中的内容?
我在 MT4 终端运行脚本。
重新打开内存中的文件后,为什么无法读取其中的内容?
至少你不会在重启计算机后试图读取内存中的文件...