DLLから関数をインポートする際の問題解決を支援します。 - ページ 4

 
エシェファイルについての良いアドバイスです。もちろん、おっしゃるとおり、チェックは必要です。ただ、それらに注意を払う価値があるかどうか、つまりチェックする価値があるかどうかについての意見を聞きたかったのです。 しかし、説明から判断すると、このような話があったと思うのですが、どうでしょうか? 私はまだ実用的なC++はあまり得意ではなく、これらのコンバータを書くのにグローバルに複雑なことはないと脳で理解していますが、現時点ではまだ私にとって少し複雑なので、特に既製の関数があればできるだけ簡単に解決したいのですが・・・・。
 

信頼はしても、検証はする :-)。そうなんです。

 

C++ Builderで実装する方法を考えています。私の理解では、EXEファイルを作るには、WinMain関数の中で3つの関数を連続して呼び出す必要があります。

ConvertData_1 (...);

rmatrixsvd(...);

ConvertData_2 (...)です。

そうだろ?DLLを形成する際の注意点は?同じように?ちょっと疑問があるのですが...。Arkhangelskyの本 "Programming in C++ Builder "を使おうとしているのですが...。

しかし、今のところ効果はない...。

 

Exeで作業してもDllで作業しても変わりはありません。

.

このスレッドの2ページ目から私の投稿をコピーしました。

-----------------------------------------------------------

次のような関数を宣言してください。
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);
.
を返します。
}

-----------------------------------------------------------

.

WinMain関数と何か関係があるのでしょうか?プログラムの入り口のようなものですね...。

もちろん謝りますが、機能が 何なのか理解していますか?

.

正直に言って、9月2日から6日まで、あなたはすでにこの作業にどれだけの時間を費やしましたか?

専門家に2時間相談(コード作成+説明)してもらったほうがいいのでは?

 

ありがとう、今わかったよ...。これらの機能はすべて外部にあるものでフレーム化されており、それをエクスポートすることになるのです。すみません、ちょっと混乱しました...。

スペシャリストについてですが、ぜひ...。もし、どこかにあるのならでも、残念ながら、ないんです、残念です、もちろん...。

ここはカザフスタン...。アルマトイやアスタナには優秀な専門家がいるのだろうが、1000km以上離れていて手が出せない :-)

だからこそ、自分で考えなければならないのです。そうですね、もうかなり時間を浪費してしまいました :-)まあ、気にしないでください.モスクワも一日にして成らず。:-) よく言われることです。

 

Visual Studio 2010についてよくわからないのですが...。今はベータ版しかないのでしょうか?私が理解する限りでは、まだリリースはないのですか?

ビジュアルアシストは別売ですか?

Visual Studio 2008のペネトレイトリリースはどうでしょうか?

 

厳密には、2005年からで十分です。あるいは2003年。

Visual Assistはサードパーティ製ユーティリティです。

 

もちろん、目の前の課題に対しては、これらで十分です。でも、視野には入れておきたい。この課題は最後ではないと思うのですが...。

しかし、Visual Studio 2009は発生しないようなので、最新の利用可能なバージョンについてお聞きしたのですが...。

研究するために......だから、一番上まで勉強して......。:-)

 

ついに何かが生まれた...。:-)

しかし、関数をエクスポート可能に指定すると、コンパイル時に問題が発生します...。

指定した場合。

1.) int SVD_DLL(double inA[], double outW[], double outU[], double outVT[], int Row, int Col), エラーなしでコンパイルできる。

2) extern "C" int __declspec(dllexport) __stdcall SVD_DLL(double inA[], double outW[], double outU[], double outVT[], int Row, int Col), ではエラーになる。

[ILINK32 Error] Error: Unresolved external 'ap::afree(void *) referenced from\COMP-BSN/MY DOCUMENTS!ALGORITMSSVDSVD_DLL2009.09.07 FY2009PROJECT_DEBUG_BUILD
[ILINK32 Error] Error: Unresolved external 'ap::minint(int, int)' referenced from\COMP-BSN!ALGORITMSSVDSVD_DLL2009.09.07 translated by \PROJECT DEBUG_BUILD
[ILINK32 Error] Error: Unresolved external 'ap::amalloc(unsigned int, unsigned int)' referenced from\COMP-BSN/MY DOCUMENTS!ALGORITMSSVDSVD_DLL\2009.09.07 FY2009PROJECT DEBUG_BUILD
[ILINK32 Error] Error: Unresolved external 'rmatrixsvd(ap::template_2d_array<double, 1>, int, int, int, ap::template_1d_array<double, 1>&, ap.Template_2d_array<double, 1>, ap::template_2d_array<double, 1>&, ap::template_2d_array<double, 1>&)' from\COMP-BSN MY DOCUMENTS を参照!algoritms ↵2009.09.07

これはどう解釈すればいいのでしょうか。

私のコードに何か間違いがあるのでは?

以下はそのコードです。

//---------------------------------------------------------------------------

#include <windows.h>
//include "H_svd_dll.h"
//---------------------------------------------------------------------------

#pragma argsused

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved).
{
1を返します。
}

//---------------------------------------------------------------------------
#include "stdafx.h"
#include "svd.h"
//---------------------------------------------------------------------------

int Convert_Double_To_Real_2D_Array(double inArr[], ap::real_2d_array outArr, int iRow, int iCol).
{

for(int line = 0; line < iRow; line++)
for(int column = 0; column < iCol; column++)
outArr(line, column) = inArr[line*iCol + column];


1を返します。
}

//---------------------------------------------------------------------------

int Convert_Real_1D_Array_To_Double(ap::real_1d_array inArr, double outArr[], int iRow, int iCol).
{
int minmn = ap::minint(iRow, iCol);
for(int i = 0; i < minmn; i++)
outArr[i] = inArr(i);

1を返します。
}

//---------------------------------------------------------------------------

int Convert_Real_2D_Array_To_Double(ap::real_2d_array inArr, double outArr[], int iRow, int iCol).
{
for(int line = 0; line < iRow; line++)
for(int column = 0; column < iCol; column++)
outArr[line*iCol + column] = inArr(line, column)です。

1を返します。
}

//---------------------------------------------------------------------------

extern "C" int __declspec(dllexport) __stdcall SVD_DLL(double inA[], double outW[], double outU[], double outVT[], int Row, int Col).
//int SVD_DLL(double inA[], double outW[], double outU[], double outVT[], int Row, int Col)
{
ap::real_2d_array Aです。
ap::real_1d_array Wです。
ap::real_2d_array U;
ap::real_2d_array VT;
int Uneeded = 2;
int VTneeded = 2;
int AdditionalMemory = 2;
// 配列のためのメモリを確保する
int minmn = ap::minint(Row, Col)とする。
A.setbounds(0, Row-1, 0, Col-1);
W.setbounds(0, minmn-1)とする。
U.setbounds(0, Row-1, 0, Col-1);
VT.setbounds(0, Row-1, 0, Col-1);

//入力パラメータをdoubleからap::real_2d_arrayに変換する
Convert_Double_To_Real_2D_Array(inA, A, Row, Col);

// 行列の svd-分解
rmatrixsvd(A, Row, Col, Uneeded, VTneed, AdditionalMemory, W, U, VT);

// W, U, VT の結果を out に変換する.
Convert_Real_1D_Array_To_Double(W, outW, Row, Col);
Convert_Real_2D_Array_To_Double(U, outU, Row, Col);
Convert_Real_2D_Array_To_Double(VT, outVT, Row, Col);

1を返します。
}

 
2) extern "C" int __declspec(dllexport) __stdcall SVD_DLL(double inA[], double outW[], double outU[], double outVT[], int Row, int Col), ではエラーが発生する。

[ILINK32 Error] Error: Unresolved external 'ap::afree(void *)' referenced from \\COMP-BSN\МОИ ДОКУМЕНТЫ\!ALGORITMS\SVD\SVD_DLL\2009.09.07\PROJECT\DEBUG_BUILD\U_SVD_DLL.OBJ

もし、ソース付きのアーカイブをアップロードしていただければ、コンパイルしてリンクするようにします。

あと-mq4インジケータそのものを見せてくれることを約束してください:-)。