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).
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); {...}.
なんとなくhファイルに書いてみたけど
で、cppでは
...
...そして、私は文字列を全く扱わないことを好みます....なぜDLLに必要なのか、それは美しさのため?
また、ボーランド自身は、必要であれば、メタトレーダー式にchar*またはchar[]を使うことを推奨しています。
ビルダーでの正しい宣言の仕方は以下の通りだと思います(正確には覚えていません)。
extern "C" __declspec(dllexport) int __stdcall GetIntValue();
ビルダーで次のように宣言するのが正しいと思います(正確には覚えていません)。
extern "C" __declspec(dllexport) int __stdcall GetIntValue();
そうそう
ありがとうございました。extern "C" int __declspec(dllexport) __stdcall GetIntValue() の後にこの例で動きました。
double関数とstring関数で試してみましたが、こちらもうまくいきました。私は、あなたから得た知識を実務に生かすことにしました。しかし、残念なことに...。残念ながら成功しませんでしたが。
もし可能なら、もう1度だけ助けてください。
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のエラーが、それぞれ異なるバリエーションで表示されます。ヘッダーファイルの中にあるべきと理解していますが(そうすれば、2つのエラーしかありません)。
[BCC32 Error] Usvd.cpp(128): E2356 Type mismatch in redeclaration of '__stdcall rmatrixsvd(ap::real_2d_array,int,int,ap::real_1d_array &,ap::real_2d_array &)'
[BCC32 Error] UHsvd.BCC32: UHsvd.BCC32: UHsvd.h(111): E2344 '__stdcall rmatrixsvd(ap::real_2d_array,int,int,int,ap::real_1d_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 vtneedです。
int additionalmemoryです。
ap::real_1d_array& w,
ap::real_2d_array& u,
ap::real_2d_array& vt); {...}.
私の理解が正しければ、ap::real_1d_arrayはクラスです。また、ap::real_1d_array & はクラスオブジェクトへの参照である。
しかし、やれやれ、Dllにパラメータとして渡せるのはダブルのmyData[]だけです。
は、関数の中では double * のように見えるでしょう。
私の理解が正しければ、ap::real_1d_arrayはクラスです。また、ap::real_1d_array & はクラスオブジェクトへの参照である。
しかし、なんと、Dllにパラメータとして渡せるのは、doubleのmyData[]だけです。
で、関数では double * のように表示されます。
全く同感です。インポートするときにMQLでdoubleと宣言しておきます。しかし、現在、C++ Builder 2009でDLL自体を作成するのに苦労しています。構築時にエラーが発生するのですが。宣言を使用しない場合
extern "C" bool __declspec(dllexport) __stdcall rmatrixsvd(ap::real_2d_array a, ..., ...) であれば、問題なく、Bilderでライブラリのコンパイルに成功するはずです。さて、Bilderプロジェクトでエクスポート関数の宣言を正しく作成する方法がわかりません:-)
rmatrixsvd関数をエクスポートする機能を持つ、動作するDLLです。
全く同感です。インポートする際にMQLでdoubleと宣言する予定です。しかし、今のところC++ Builder 2009でDLLそのものを作成することができず、困っています。構築時にエラーが発生するのですが。宣言を使用しない場合
extern "C" bool __declspec(dllexport) __stdcall rmatrixsvd(ap::real_2d_array a, ..., ...) であれば、問題なく、Bilderでライブラリのコンパイルに成功するはずです。さて、Bilderプロジェクトでエクスポート関数の宣言を正しく作成する方法がわかりません:-)
rmatrixsvd関数をエクスポートする機能を持つ、動作するDLLです。
ブルブル。妙に納得してしまったようですね。
.
実は、「アダプター」や「ブリッジ」を書こうという話なんです。
"アダプタ "という観点から、エクスポートされた関数のパラメータを
は、メタトレーダーが渡すことのできるパラメータと一致させる必要があります。
...つまり、呼び出したい場所に呼び出しを渡す追加の関数が必要なのです。
そして、機能上必要ないという観点からの「ブリッジ
と宣言することで、仕事そのものを行うことができます。
またその逆も然りで、作業を行う関数を呼び出す必要はありません。
.
つまり、インターフェースと実装を分離する必要がある、つまり、実装は、クラス
.そして、誰にも知られることのないDllの外部にある関数。
.
しかし、一例を考えてみよう。
.
このように関数を宣言します。
extern "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 = ;
.
//calculate
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を入れるとすぐにエラーになる...。
お忙しい中、ありがとうございました。