帮助解决从dll中导入函数的问题 - 页 3

 

不要感谢 :-)。你将自己做一切事情 :-)。

分开步骤。

.

#1(测试一个,你不需要做;-) 。

在C++中,创建一个矩阵,行数MAX_ROW=5...10,列数MAX_COL=5...10(数字随机)。

使得随机充满了数据。

.

#2(测试一,你不必做;-):解决以下问题。

步骤1中的矩阵需要以一维形式表示。

创建大小=MAX_ROW*MAX_COL的一维数组double,其中数据按照公式存储

for(line = 0 ... MAX_COL-1)

for(column = 0 ... MAX_COL-1)

array[line*MAX_COL + column] = data[line][column]。

.

#3:解决以下问题/作为一个函数

你从步骤(2)得到一个一维数组的双数,即行和列的数量。

你必须把这个数组的数据放入ap::real_2d_array对象中

.

#4:你得到的ap::real_2d_array/对象是一个函数

你必须把它转换成一维数组的双数,得到行和列的数量。

.

#5(测试一个,你不需要做;-) 。

你必须将一维数组转换为二维矩阵(如步骤1)。

将得到的矩阵与步骤1的原始矩阵进行比较。

在不匹配的情况下,要想办法解决。

.

将需要的主要功能是功能3和4。

步骤1,2=训练,你必须这样把数据打包到Mql中,步骤5=测试。

.

一般来说,我会为5个步骤中的每一个步骤制定功能。

.

Mql中的奇异变换。

https://www.mql5.com/ru/code/7359

 

谢谢你对这种奇异分解算法应该如何工作的详细分解。第1-3项已经实施。问题仍然出在第4点上,因为我还不能像我之前写的那样,用导出函数ramatrixsvd(...)创建一个工作的dll。

因为在原C++代码中加入了extern "C" bool __declspec(dllexport) __stdcallrmatrixsvd(...),我得到了错误...虽然如果你只编译boolrmatrixsvd(...),就不会有错误...但我需要一个可导出的函数...这就是它变得混乱的地方...

谢谢你的帮助。

 

关于第4点(以及其他所有的)。rmatrixsvd与此毫无关系。

奇异分解算法也是如此。这些项目与以下方面有关

来发送/接收Dll的数据。

.

为项目编写的原型函数。4:

空白的Convert_real_2d_array_to_double(

const ap::real_2d_array & arr,

双倍 * 数据。

int & lines。

int & columns

);

.

也就是说,你需要学习如何从ap::real_2d_array获得行数、列数和数据。

.

从这一点来看。

const ap::real_2d_array & arr

---->>>

得到它。

双倍 * 数据。

int & lines。

int & columns

 

再次非常感谢您的时间。

我再次非常仔细地阅读了所有的帖子,看来我终于明白了:-)该怎么做。

事实上,rmatrixsvd函数本身在这里就是一种 "主力军",你不需要尝试导出它。

你只需要按时把货物放在车上,然后在交货时轻轻地把它卸到正确的地方。

比喻说,到了目的地。我现在对你的理解正确吗?

换句话说,我需要在C++中制作这些数据转换器(3和4),并在MQL中使用它们,也就是说,它们应该在MQL中声明,而在DLL中则是

被声明为可导出,以便Metatrader可以使用它们。我对自己的问题理解正确吗?

如果是这样,我想我现在明白你的意思了,那就更好了,因为我当时不知道如何将二维和一维数组联系起来。

此外,你不能在MQL中把数组声明为[ ][ ],对吗?也就是说,这个数组至少应该被声明为a[ ][100]。是这样吗? 还是我搞错了?

而这并不是很方便,因为你事先并不知道一个二维数组的维度是多少,而提前为数组预留内存并不是最好的办法。

但在C++中没有这样的问题? 所以,二维数组可以被形象地称为 "橡胶"。是这样吗?还是说C++中也有一些微妙之处?

我还想问问你关于Borland Builder 2009的情况。也许它不像第6个那样有故障?实际上是否可以用它来工作?

因为阿尔苏 说他是个弱智,据我所知。:-)但据我所知,你是用Visual Studio编程的?它更酷吗?而且没有故障?现在的最新版本是什么?

我很高兴在你的帮助下,我找到了问题的根源。现在我将努力实现这一切......

 
boysn >> :

特别是在MQL中,你不能把数组声明为[ ][ ],对吗?也就是说,你至少应该把它声明为一个[ ][100]。是这样吗? 还是我搞错了?

而这并不是很方便,因为你事先并不知道一个二维数组的维度是多少,而提前为数组预留内存并不是最好的办法。

很好!:-)我很高兴这个过程有了进展:-)。

.

当然,你可以在Mql4中声明二维数组。

以同样的方式,你可以从DLL中导入函数

#import myLib

void showMatrix(double & array[][], int rows, int cols);

##进口

.

但这里有一个细微的差别:在C语言中,我们声明一个接受一维数组的函数。

行和列的数量 void showMatrix(double *array, int rows, int cols);

而该数组作为一个一维数组工作,其中的寻址被安排在一个循环中。

for(line = 0 ... MAX_COL-1)
for(column = 0 ... MAX_COL-1)
array[line*MAX_COL + column] = data[line][column]。

.

也就是说,Mql抛出了一个具有连续缓冲区的二维数组。

.

只是不要踩到同一个耙子--步骤3和4的函数在你的Dll里面使用。

在Dll-ins的接口函数中,它将从Mql获取带有行/列数的一维数组。

它将把它们转换为ap::real_2d_array,传给rmatrixsvd

并将结果放入输出缓冲区,该缓冲区必须有正确的行和列

必须是正确的。

.

当然,输出缓冲区应该提前预留--这应该在Mql中完成。

如果你不知道尺寸,我的意见是,你应该使

一个高维度的一维数组,例如

双出[2500]。

和一个单元素数组,用于输出行/列的值

双倍Raws[1]。

double cols[1];

.

Visual Studio更酷。特别是在视觉辅助方面。我不知道STL在Debuilder中如何工作。Unicode几乎有100%的问题。

Win SDK的帮助并不能与MSDN相比。有传言说,为了与Delphi整合,Borland的编译器

对梅花来说,已经发生了非积极的变化。

.

而与记忆打交道是一个班级的主题。

 

一切似乎在理论上都很清楚,我将着手实施,然后我们再看看:-)。"眼睛是害怕的,但手在做工作......"

再次感谢您的宝贵指导。我真的想实现这个算法...像往常一样,这个想法在战略上已经很遥远了,但在战术和实践上

我必须追上它。我希望我能够做到这一点。如果我有任何问题,请毫不犹豫地帮助我提供建议。谢谢你!

 

我想再次澄清一下动态数组的维度问题。

在MQL中,一个一维数组可以定义为array[ ],然后当程序知道该数组的维度N。

你可以使用ArrayResize(array, N)函数。一个二维数组可以只定义为array[ ][100],即第二维度

同样应该知道,如果你不知道,你应该采取最大限度,这样在任何情况下都足够了。你可以在MQL中定义

编译器不会抱怨,但是ArrayResize 函数会在数组的第一个维度设置一个新的大小

在MQL中没有针对第二维的此类函数。如果你定义了一个二维数组array[N][M],编译器会返回一个错误说

一个整数,也就是说,维数应该事先定义好,至少是数组的第二维。

在C++中也是如此吗?没有办法摆脱它,是吗?我想再一次澄清。

奇异分解使用了C++的AP库(描述见附件)。据我所知,其中有一些功能可以解决

阵列的动态一维和二维的问题。在我的情况下,在编写数据转换器时,我可以在DLL内使用它们吗?

void setbounds(int iLow1,int iHigh1,int iLow2,int iHigh2)
为阵列分配内存。
这将删除旧的数组内容并释放为其分配的内存,然后分配一个新的独立的内存区域,其大小为(iHigh1-iLow1+1)*(iHigh2-iLow2+1)元素。
新数组中元素的编号由第一维开始,以iLow1结束,第二维相同。

还有以下功能。

void setcontent(int iLow1,int iHigh1,int iLow2,int iHigh2,const T *pContent)
该方法与setbounds()方法类似,例外的是pContent[]数组的内容在内存分配后被复制到其中。
pContent数组包含一个逐行写入的二维数组,即元素[iLow1, iLow2]先入,然后是[iLow1, iLow2+1],等等。

如果我没有理解错的话,这正是我需要的函数,也就是说,它从一个一维数组中做出一个二维数组,也就是说,它本质上是一个转换器。

我说对了吗?

 

C++的AP库

 
C++的AP库
附加的文件:
 

MQL:在一维中,我们可以根据自己的需要改变尺寸,是的。然后我们通过索引(行*MAX_COL+col)获得所有的东西。

在二维中,第二维是固定的。也就是说,我们不能从数组a[100][100]中读取矩阵元素[15][32]。

.

而且我建议你检查一下AP库的功能是如何工作的。

不要停在Dll上。写一个exe,它更容易运行和调试。

插入调试打印

我当然可以给出建议--但对于建议,你需要测试它--。

编写测试代码。

.

至于数组和变量的内容--无论在哪里--都是如此。

最好把强行、严格地初始化它们作为一项规则。