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

 

我建议张贴和分析所有种类的mql5 "不可能",比如这个:条件编译

为了折磨好奇心强的人,刺激读者自己的创造力,有可能一开始就展示出这种可能性(不透露实施情况)。

但最后,有必要(有义务!)揭示这个秘密并 提供一个实施样本

当然,这样的 "两阶段 "形式充满了骗局,但我要依靠奇迹创造者的诚实陈述,他们准备 "退缩"。:)

--

So........我们来了!

 
Итак........ НАЧАЛИ !

来了,我先来。:)

虽然最 "神奇 "的地方慢了很多 - 但...也许某个mql5的向导会找到一种方法来加速它?

// 你可以自己看看他们有多慢,这个测试专门用来测量他们的速度。

这段代码是按照使用二维数组的通常语法工作的。

void OnStart()
  {
   float  FA[5][3];
   long st=GetTickCount();
   for(int t=0;t<1000000;t++)
     {
      for(int i=0;i<5;i++)
        {
         for(int j=0;j<3;j++)
           {
            FA[i][j] = (i+1.5)*(j+1.3);
           }
        }
     }
   Print("====",GetTickCount()-st," ms ====");
   
   st=GetTickCount();
   C2DMagicArray  MA(5,3);   
   for(int t=0;t<1000000;t++)
     {
      for(int i=0;i<MA.SizeL();i++)
        {
         for(long j=0;j<MA.MaxR();j++)
           {
            MA[i][j] = (i+1.5)*(j+1.3);  
            // ^  ^  Как это сделано ??? Можете повторить ? :))
           }
        }
     }
   Print("====",GetTickCount()-st," ms ====");
   st=GetTickCount();
   for(int t=0;t<1000000;t++)
     {
      for(int i=0;i<MA.SizeL();i++)
        {
         for(long j=0;j<MA.MaxR();j++)
           {
            MA.Set(i,j,float((i+1.5)*(j+1.3)));
           }
        }
     }
   Print("====",GetTickCount()-st," ms ====");

   for(int i=0;i<MA.SizeL();i++)
     {
      for(int j=0;j<MA.MaxR();j++)
        {
         Print( MA[i][j] );  
         //        ^  ^    Как это сделано???  :))  Жду Вашу версию!
        }
     }
  }

你还不能编译代码:内联将在以后进行......- 否则,它就不会那么有趣了。:)

那么,谁能重复这一壮举?

附加的文件:
 

当弗拉基米尔在等待我们的答案时,我有一个值得一试的问题;)


我们怎样才能使一个ex5从32和64的DLL中导入函数
比方说,为两个(32/64)终端制作一个ex5。


Документация по MQL5: Основы языка / Препроцессор / Импорт функций (#import)
Документация по MQL5: Основы языка / Препроцессор / Импорт функций (#import)
  • www.mql5.com
Основы языка / Препроцессор / Импорт функций (#import) - Документация по MQL5
 
sergeev:

当弗拉基米尔在等待我们的答案时,我有一个值得一试的问题;)


我们怎样才能使一个ex5从32和64的DLL中导入函数
例如,为两个(32/64)终端制作一个ex5。

你又在要求例外了吗?
 
Urain:
你又在要求例外了吗?

不,我以前从未要求过例外。 可能不是因为这个,更多的是关于#ifdef

我希望,如果弗拉基米尔能够使用他的代码进行重载操作,他的方法可以用于自动启用所需的DLL o_O。

一种#define内的#import

 
MetaDriver:

来了,我先来。:)

那么,谁能重复这一壮举?

重复你的壮举要花很长时间 :)尽管在文件中也有一个类似的例子。

//--- перебираем строки для сложения
   for(int i=0;i<rows;i++)
     {
      //--- запишем результаты сложений строк матриц в массив
      for(int k=0;k<cols;k++)
        {
         arr[k]=this[i][k]+m[i][k];
        }
      //--- поместим массив в строку матрицы
      res[i]=arr;
     }
 
Yurich:

重复你的壮举要花很长时间 :)尽管在文件中也有一个类似的例子。

所以用这个比喻来做......没什么大不了的!......。:-))

我也会看一看。;)

 
sergeev:

我怎样才能 32和64 DLL中的函数 导入一个ex5中?
比方说,为两个(32/64)终端制作一个ex5。

这些函数有不同的名字。 而在代码中,根据终端的比特率,把条件性的调用,放到不同的函数上。

在我看来,终端在第一次调用时加载DLL。没有电话--没有试图装载,也没有关键的流产。

我没有看到其他的方法。 终端位数是由TerminalInfoInteger()返回的。

bool x64 = TerminalInfoInteger(TERMINAL_X64);

所有这些都可以直接在MyLib.ex5库中完成。



void MyLibMultibitFunc()  // библиотечная универсальная обёртка для DLL-функции
{
  if(x64) { MyDll64Func(); }
  else { MyDll32Func(); }
}
 
MetaDriver:

这些函数有不同的名字。 而在代码中,根据终端的比特率,把条件性的调用,放到不同的函数上。

在我看来,终端在第一次调用时加载DLL。没有电话--没有试图装载,也没有关键的流产。

我没有看到其他的方法。 终端位数是由TerminalInfoInteger()返回的。

所有这些都可以直接在MyLib.ex5库中完成。

是的,同样的观点,终端只在第一次调用时创建dll-function对象。

关于比特性,似乎有一些人在论坛上提到了数字的不同表示方法,如果变量的比特字段给出了一个结果,但它将是32,如果其他,它将是64。它可以由经验决定。

 
MetaDriver:

这些函数有不同的名字。 而在代码中,根据终端的比特率,把条件性的调用,放到不同的函数上。

在我看来,终端在第一次调用时加载DLL。没有电话--没有试图装载和关键的流产。

不,先生们,你们不明白这个问题。 使用TERMINAL_X64或_Is64的可能性是已知的。

但不幸的是,终端的做法却不一样。

- 当你赶到图表时,它会检查所使用的DLLs列表,并在Dependencies窗口显示导入的函数 列表
在那些不符合位数的DLL上,它写了一个警告MQL5\Libraries\somedll64.dll'不是32位版本

- 但当你按下 "确定 "键,专家顾问就开始了,你就真的有麻烦了。

终端产生错误193并卸载EX5

无法打开'MQL5\Libraries\somedll64.dll'(193)。
EX5加载失败

我想提请你注意的是,这段代码只包含DLL声明,没有导入任何函数

#import "somedll64.dll"
##进口
Документация по MQL5: Основы языка / Препроцессор / Импорт функций (#import)
Документация по MQL5: Основы языка / Препроцессор / Импорт функций (#import)
  • www.mql5.com
Основы языка / Препроцессор / Импорт функций (#import) - Документация по MQL5
 

因此有了第一个问题。

如何从32位的dll,如user32.dll等导入函数 到64位的应用程序中?还是在系统中存在着该名称的副本,并创建了OOP空间?