在MQL5中,总是有漏洞可钻! ;) - 页 8

 
你是在桶里混水摸鱼。
指向变量的指针、指向函数、通过引用获取地址都是MQL的限制。
这甚至不是语法上没有规定的东西,而是对内存处理的禁止。
即使是void*指针也不是通常C-like意义上的指针。
它是一个与类对象一起工作的对象,以防止它们被复制。
同样的引用&不是一个地址的取值,而是编译器传递对象而不把它复制到堆栈中的一个指定符。
你想用Syakh写,用Syakh写,然后导入dll,这很好。

如果你真的心痒难耐,而你又不会foregn dll,那么从本地dll导入并不是什么大罪,你的MQL产品也不会因此而失去价值。

不要大惊小怪,例如,你可以只用一个4字节的指针和导入memcpy来处理一个终端进程内的内存。

#import "msvcrt.dll"
int memcpy(short&,short&,int)。
int memcpy(int&,int&,int);
int memcpy(double&,double&,int);
int memcpy(string& s,string& int)。
##进口

某种包装类。

结构TPtr
{
int addr;
TPtr():addr(0){}。
TPtr(const TPtr& r):addr(r.addr){}。
模板<typename _T> TPtr operator =(_T& r) {
addr = memcpy(r,r,0)。
返回这个。
}
};


和一个使用的例子。

string sval = "123";
短bval=123。
int ival = 123;
double dval = 123;

TPtr p = sval;
int ptrs = p.addr;
p = bval。
int ptrb = p.addr;
p = 缬氨酸。
int ptri = p.addr;
p = dval。
int ptrd = p.addr;

这样,你就可以随心所欲地操纵内存...不是通常的C-pointers,但仍然

它可能有什么用?
那么,比如说,你可以使用GlobalAlloc导入功能,这样你就不需要使用全局变量在模块之间传输数据。
GlobalAlloc为进程分配内存,这与堆或内部静态虚拟没有关系,用于猫头鹰或诱导的工作。
你可以在其中放置任何大小的数组,并使用memcpy进行索引。

进口的例子。

#define HANDLE int
#define LPVOID int

#import "kernel32.dll"
HANDLE GlobalAlloc(uint flags, uint cnt)。
LPVOID GlobalLock(HANDLE hmem)。
int GlobalUnlock(HANDLE hmem)。
HANDLE GlobalFree(HANDLE hmem)。
#import "ntdll.dll".
// GetLastError在MT中已经存在,所以从WinAPI中使用。
int RtlGetLastWin32Error()。
##进口


一个用法的例子。

// owl N1,准备好你的利率数组

MqlRates rates[123];
// 在这里,我们填写
HANDLE memid = GlobalAlloc(GMEM_MOVEABLE, 123*sizeof(MqlRates));
LPVOID ptr=GlobalLock(memid)。
memcpy(ptr,rates[0].time, 123*sizeof(MqlRates)); // 在这里,为了编译,应该使用原型 int memcpy(int&,const datetime&,int)
GlobalUnlock(memid)。
// 发送一个内存描述符
EventChartCustom(CID, MY_SEND_DATA, memid, 0, "")。

// owl N2
void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
{
if( id ==CHARTEVENT_CUSTOM+MY_SEND_DATA)
{
LPVOID ptr = GlobalLock((HANDLE)lparam)。
MqlRates rates[123];
//得到的是费率
memcpy(rate[0].time,ptr,123*sizeof(MqlRates)); // 这里是原型 int memcpy(datetime&,const int&,int)
GlobalUnlock(memid)。
GlobalFree(memid)。
}
}

就这样......没有管道、外部文件、导入遗留的dlls。
我只是冲着一个小样本,有很大的可能性,但我的思想是没有界限的。
是的,关于GlobalAlloc,我还是建议使用GMEM_MOVEABLE,用锁和内存的loak来获取指针,进行特定的操作,再把它放回去。
如果你使用固定的全局内存,在N个开放描述符的数量上,可能会发生碎片化现象...
它是操作系统内核根据负载情况想要的任何东西。
祝你好运,黑客们 )))
 
alexsis78:

不要含糊其辞,例如,你可以只使用一个4字节的指针并导入memcpy来处理终端进程内部的内存
你有点搞错分支了。
 

亨利-沃伦有一本旧书《程序员的算法技巧》,里面有很多这样的技巧。然而,由于缺乏C++指针,大多数例子在MQL中都无法工作。

我会试着找些有趣的东西。

 
你不会在C语言中找到与我的例子相似的地方 )))首先它是MQL,其次它是C语言指针语法的变通方法。

对于那些知道加的人来说,再澄清一下。

在C语言中:
int var = 0; // 声明变量var
int* ptr = &var; //获得 变量var的指针
int var2 = *ptr; // 将var的指针值复制到var2中

在MQL中:
#import "msvcrt.dll"
uint memcpy(int& destination, const int& source, int cnt); // memcpy的原型,获取变量destination的地址
uint memcpy(int& destination, uint ptr, int cnt);//从地址ptr复制的memcpy原型
//编译器将通过第二个参数的类型差异来替代两个原型中的一个
//让我们取一个指针类型,例如uint
#import

int var = 0;
uint ptr = memcpy(var,var,0); //得到一个变量var的指针ptr(这里memcpy不复制任何东西,而是返回地址var)
int var2
memcpy(var2, ptr, 4); //从指针ptr复制4个字节或sizeof(int)到变量var2(memcpy的第二个原型工作)

我希望你会发现这个方法很有用 ))
 
alexsis78:
你不会发现我的例子在C))中的相似性。)首先,它是MQL,其次,绕过了C的指针语法。 ,我希望你会发现它是有用的 ))))

人们,不要为了写东西而写东西。

所有这些带有memcpy 的变体都是几年前嚼过的,不适合这个话题。

 
o_O:

人们,不要为了写东西而写东西。

所有这些memcpy选项都是多年前嚼过的,不适合这个话题。

我同意,此外还描述了没有指针运算的变体,也就是有缺陷的。在C#中并不真正需要它们,没有指针。有不安全因素,但它只用于个人使用,而且会有很多限制,如禁止通过网络安装等等。
 

我想把它放在代码库里,但后来我改变了主意。

在Kaggle上使用MQL5,数字识别器任务

Digit Recognizer | Kaggle
  • www.kaggle.com
Kaggle is your home for data science. Learn new skills, build your career, collaborate with other data scientists, and compete in world-class machine learning challenges.
附加的文件:
sampleMNIST.mq5  25 kb
 
o_O:

人们,不要只是为了写东西而写东西。

所有这些memcpy选项已经被咀嚼了很多年,不适合这个话题。

为什么说是 "不合适"?

我已经忘了它在哪里,也找不到它了......

顺便说一下,我认为在不调用外部DLL的情况下保存一个数组的指针是一个壮举。我不希望每次启动指标时都要确认我同意从DLL中导入函数

 
George Merts:

为什么是 "不适合"?

我已经忘了它在哪里,也找不到它了......

顺便说一下,我认为在不涉及外部DLL的情况下保存一个指向数组的指针是一项壮举。我不希望每次启动指标时都要确认我同意从DLL中导入函数

将数组包裹在一个类中,你可以用新的MQL伪指针对其进行
 
Alexey Volchanskiy:
将数组包裹在一个类中,你可以用new

Alexey,你也应该告诉我如何将OnCalculate()函数 发出的数组包裹到一个类中--在这种情况下,你不能不复制指针。

目前,我只是把数据复制到我的类-数组中,然后拉出一个指向这个对象的指针。但是,这将得到一些额外的复制,正如我所看到的,这将增加相当明显的 "沉重感",因为频繁点击和大量的图表。我想摆脱这种抄袭。但是,除了通过DLL(标准或自写)的拐杖,我没有任何建议。

在服务台,他们一直把我推回说 "该对象可能被删除"。但这些是他们自己的数组!当我说我可能会创建一个对象,然后将其删除,指针将变得无效时--他们回答说 "是我要为这个负责"。这是一种 "双重道德 "在这里起作用。

我不关心DLL - 但这种指标在运行时需要不断确认 - 真是麻烦......