帮助解决从dll中导入函数的问题 - 页 3 12345678910 新评论 Андрей 2009.09.04 01:23 #21 不要感谢 :-)。你将自己做一切事情 :-)。 分开步骤。 . #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 Сергей 2009.09.04 08:47 #22 谢谢你对这种奇异分解算法应该如何工作的详细分解。第1-3项已经实施。问题仍然出在第4点上,因为我还不能像我之前写的那样,用导出函数ramatrixsvd(...)创建一个工作的dll。 因为在原C++代码中加入了extern "C" bool __declspec(dllexport) __stdcallrmatrixsvd(...),我得到了错误...虽然如果你只编译boolrmatrixsvd(...),就不会有错误...但我需要一个可导出的函数...这就是它变得混乱的地方... 谢谢你的帮助。 Андрей 2009.09.04 08:58 #23 关于第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 Help solve a problem Сергей 2009.09.04 17:07 #24 再次非常感谢您的时间。 我再次非常仔细地阅读了所有的帖子,看来我终于明白了:-)该怎么做。 事实上,rmatrixsvd函数本身在这里就是一种 "主力军",你不需要尝试导出它。 你只需要按时把货物放在车上,然后在交货时轻轻地把它卸到正确的地方。 比喻说,到了目的地。我现在对你的理解正确吗? 换句话说,我需要在C++中制作这些数据转换器(3和4),并在MQL中使用它们,也就是说,它们应该在MQL中声明,而在DLL中则是 被声明为可导出,以便Metatrader可以使用它们。我对自己的问题理解正确吗? 如果是这样,我想我现在明白你的意思了,那就更好了,因为我当时不知道如何将二维和一维数组联系起来。 此外,你不能在MQL中把数组声明为[ ][ ],对吗?也就是说,这个数组至少应该被声明为a[ ][100]。是这样吗? 还是我搞错了? 而这并不是很方便,因为你事先并不知道一个二维数组的维度是多少,而提前为数组预留内存并不是最好的办法。 但在C++中没有这样的问题? 所以,二维数组可以被形象地称为 "橡胶"。是这样吗?还是说C++中也有一些微妙之处? 我还想问问你关于Borland Builder 2009的情况。也许它不像第6个那样有故障?实际上是否可以用它来工作? 因为阿尔苏 说他是个弱智,据我所知。:-)但据我所知,你是用Visual Studio编程的?它更酷吗?而且没有故障?现在的最新版本是什么? 我很高兴在你的帮助下,我找到了问题的根源。现在我将努力实现这一切...... Андрей 2009.09.04 18:28 #25 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的编译器 对梅花来说,已经发生了非积极的变化。 . 而与记忆打交道是一个班级的主题。 Help solve a problem Сергей 2009.09.04 21:06 #26 一切似乎在理论上都很清楚,我将着手实施,然后我们再看看:-)。"眼睛是害怕的,但手在做工作......" 再次感谢您的宝贵指导。我真的想实现这个算法...像往常一样,这个想法在战略上已经很遥远了,但在战术和实践上 我必须追上它。我希望我能够做到这一点。如果我有任何问题,请毫不犹豫地帮助我提供建议。谢谢你! Сергей 2009.09.05 17:36 #27 我想再次澄清一下动态数组的维度问题。 在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],等等。 如果我没有理解错的话,这正是我需要的函数,也就是说,它从一个一维数组中做出一个二维数组,也就是说,它本质上是一个转换器。 我说对了吗? Help solve a problem Сергей 2009.09.05 17:44 #28 C++的AP库 Сергей 2009.09.05 17:45 #29 C++的AP库 附加的文件: ap.russian.rar 5 kb Андрей 2009.09.05 17:57 #30 MQL:在一维中,我们可以根据自己的需要改变尺寸,是的。然后我们通过索引(行*MAX_COL+col)获得所有的东西。 在二维中,第二维是固定的。也就是说,我们不能从数组a[100][100]中读取矩阵元素[15][32]。 . 而且我建议你检查一下AP库的功能是如何工作的。 不要停在Dll上。写一个exe,它更容易运行和调试。 插入调试打印。 我当然可以给出建议--但对于建议,你需要测试它--。 编写测试代码。 . 至于数组和变量的内容--无论在哪里--都是如此。 最好把强行、严格地初始化它们作为一项规则。 12345678910 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
不要感谢 :-)。你将自己做一切事情 :-)。
分开步骤。
.
#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编程的?它更酷吗?而且没有故障?现在的最新版本是什么?
我很高兴在你的帮助下,我找到了问题的根源。现在我将努力实现这一切......
特别是在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库
MQL:在一维中,我们可以根据自己的需要改变尺寸,是的。然后我们通过索引(行*MAX_COL+col)获得所有的东西。
在二维中,第二维是固定的。也就是说,我们不能从数组a[100][100]中读取矩阵元素[15][32]。
.
而且我建议你检查一下AP库的功能是如何工作的。
不要停在Dll上。写一个exe,它更容易运行和调试。
插入调试打印。
我当然可以给出建议--但对于建议,你需要测试它--。
编写测试代码。
.
至于数组和变量的内容--无论在哪里--都是如此。
最好把强行、严格地初始化它们作为一项规则。