bool rmatrixsvd(ap::real_2d_array a, int m, int n, int uneeded, int vtneed, int additionalmemory, ap::real_1d_array& w, ap::real_2d_array& u, ap::real_2d_array& vt) 。
Usvd.cpp文件包含相同的函数,然后应该导出该函数。
bool rmatrixsvd(ap::real_2d_array a, int m, int n, int uneeded, int vtneed, int additionalmemory, ap::real_1d_array& w, ap::real_2d_array& u, ap::real_2d_array& vt。)
{
........
}
我在这个变体中开始在Bilder中构建一个DLL,一切都在 "构建",一切都在工作,没有错误。
如果我开始对UHsvd.h、Usvd.cpp进行修改,如
extern "C" bool __declspec(dllexport) __stdcall rmatrixsvd(ap::real_2d_array a,
bool rmatrixsvd(ap::real_2d_array a。 int m, int n, int uneeded, int vtneeded, 额外的内存(int additionalmemory)。 ap::real_1d_array& w, ap::real_2d_array&。 ap::real_2d_array& vt); {...}
我在一个H文件中写了一些东西
然后在cpp中只要
...
......而且我宁愿完全不和弦子打交道......。为什么你需要他们在所有的D中呢?
而Borland自己也建议在必要时使用char*或char[],Metatrader风格。
我认为在构建器中声明它的正确方法如下(我不记得具体内容了)
extern "C" __declspec(dllexport) int __stdcall GetIntValue();
我认为在构建器中声明这样的内容是正确的(我不记得具体内容了)
extern "C" __declspec(dllexport) int __stdcall GetIntValue();
在那里!完全正确。
非常感谢您的提示!在extern "C" int __declspec(dllexport) __stdcall GetIntValue()之后,它与这个例子一起工作。
我试着用double和string函数,结果也成功了。我决定将我从你那里获得的知识应用于一项实际的任务。但可惜的是...不幸的是,我没有成功。
如果你能,请再帮我一次。
在Bilder项目 中有这些用于创建DLL的文件:UHsvd.h,Usvd.cpp和其他文件。
UHsvd.h文件中有一个应该在以后导出的函数。
bool rmatrixsvd(ap::real_2d_array a,
int m,
int n,
int uneeded,
int vtneed,
int additionalmemory,
ap::real_1d_array& w,
ap::real_2d_array& u,
ap::real_2d_array& vt) 。
Usvd.cpp文件包含相同的函数,然后应该导出该函数。
bool rmatrixsvd(ap::real_2d_array a,
int m,
int n,
int uneeded,
int vtneed,
int additionalmemory,
ap::real_1d_array& w,
ap::real_2d_array& u,
ap::real_2d_array& vt。)
{
........
}
我在这个变体中开始在Bilder中构建一个DLL,一切都在 "构建",一切都在工作,没有错误。
如果我开始对UHsvd.h、Usvd.cpp进行修改,如
extern "C" bool __declspec(dllexport) __stdcall rmatrixsvd(ap::real_2d_array a,
.....),然后在不同的变体上出现了从2到19的错误,也就是说,我在头文件或cpp中做了这个声明...尽管据我所知,它应该在头文件中(那么只有2个错误)。
[BCC32 Error] Usvd.cpp(128): E2356 '__stdcall rmatrixsvd(ap::real_2d_array,int,int,int,ap::real_1d_array &,ap::real_2d_array &,ap::real_2d_array &)' 的重新声明中出现类型不匹配
[BCC32 Error] UHsvd。h(111): E2344 较早声明'__stdcall rmatrixsvd(ap::real_2d_array,int,int,int,ap::real_1d_array &,ap::real_2d_array &,ap::real_2d_array &)'
根据我的理解,有一个差异...但我并不完全理解...:-(
真的希望得到您的帮助和支持......
boysn писал(а) >> {...}
如果你可以,请再帮一次忙。
在Bilder项目中,有一些创建DLL的文件:UHsvd.h、Usvd.cpp和其他文件。
UHsvd.h文件中有一个函数,然后必须导出。
bool rmatrixsvd(ap::real_2d_array a。
int m,
int n,
int uneeded,
int vtneeded,
额外的内存(int additionalmemory)。
ap::real_1d_array& w,
ap::real_2d_array&。
ap::real_2d_array& vt); {...}
如果我理解正确,ap::real_1d_array是一个类。而ap::real_1d_array &是对一个类对象的引用。
但亲爱的,你只能把双倍的myData[]作为参数传给Dll。
这在函数中看起来会像双*。
如果我理解正确,ap::real_1d_array是一个类。而ap::real_1d_array &是对类对象的引用。
但亲爱的,只有双倍的myData[]可以作为参数传给Dll。
在函数中,它看起来像双*。
我完全同意你的观点。在导入时,我会在MQL中声明它为双倍。但目前我在C++ Builder 2009中创建DLL本身时遇到了困难。我在构建时得到了错误。如果我不使用声明
extern "C" bool __declspec(dllexport) __stdcall rmatrixsvd(ap::real_2d_array a, ...., ....) 然后Bilder中的库编译成功通过,没有任何问题。现在,我不知道如何在Bilder项目中正确创建导出函数的声明:-(,以便获得
具有导出rmatrixsvd函数能力的工作DLL。
我完全同意你的观点。在导入时,我将在MQL中把它声明为双倍。但目前我在C++ Builder 2009中创建DLL本身时遇到了困难。我在构建时得到了错误。如果我不使用声明
extern "C" bool __declspec(dllexport) __stdcall rmatrixsvd(ap::real_2d_array a, ...., ....) 那么这个库在Bilder中编译成功,没有问题。现在,我不知道如何在Bilder项目中正确创建导出函数的声明:-(,以便获得
工作DLL具有导出rmatrixsvd函数的能力。
呲呲呲。你似乎很奇怪地同意我的看法。
.
事实上,我们正在谈论写 "适配器 "或 "桥"。
从导出的函数参数的角度来看,"适配器 "是指
必须与可由元交易商传递的参数相匹配。
...也就是说,你需要一个额外的函数,将调用传递到你希望它去的地方。
而从 "桥梁 "的角度来看,它的功能是不需要的
你宣布将自己做工作。
反之亦然--没有必要调用做工作的函数。
.
也就是说,你需要把接口和实现分开,也就是说,实现可以建立在类上
...以及在Dll之外的功能,没有人会知道。
.
但让我们考虑一个例子。
.
你应该像这样声明函数。
外部 "C" bool __declspec(dllexport) __stdcall RMatrixSVD_DLL_ADAPTER(double * in1, double * in2, double * out)
// 当然,你也会在这里传递行和列的数量。
{
//将输入参数转换为ap::real_2d_array。
ap::real_2d_array a1 = convertPDoubleToReal2DArray(in1)。
ap::real_2d_array a2 = ;
.
//计算
ap::real_2d_array a3;
rmatrixsvd(a1, a2, a3)。
.
//将a3的结果翻译成out
convertReal2DArrayToPDouble(a3, out);
.
返回。
}
.
在这里--当然是--函数rmatrixsvd
没有被声明为extern "C "或__stdcall或__declspec等。
因为它是内部的、隐藏的实施的一部分。
对不起,没有完全理解,不幸的是......
从http://alglib.sources.ru/,我下载了我需要的C++实现(代码)。如果你不介意,请看一下所附的100KB档案。这个算法有很多辅助函数,总的代码行数大约是3000行......我想是的
网站上是这么说的,也就是说,它太多了,而且要把它翻译成MQL是相当困难的......你必须了解算法本身,才能正确翻译它。目前,这对我来说有点复杂。这就是为什么我想用C++ Builder 2009来制作一个带有这种现成代码的dll,并从dll中调用我需要的rmatrixsvd(...)函数。这就是我感到困惑的地方...。在哪里以及如何正确申报...有了这段代码,不需要改变那里的一行,DLL就被建立了,没有错误。但只要我把extern "C" bool __declspec(dllexport) __stdcall放进去,就会出现错误。
谢谢你的时间。