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

 

感謝しないでください :-)。すべて自分でやることになる:-)。

ステップバイステップで綴る

.

#1(テスト1、やらなくていいんです ;-) :

C++で、行数 MAX_ROW = 5...10, 列数 MAX_COL = 5...10 (数字はランダム) の行列を作成します。

ランダムにデータが入るようにする。

.

#2 (テスト1、やらなくていいです ;-) : 次の問題を解いてください。

手順1の行列を一次元で表現する必要がある。

size=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)から1次元配列doubleが与えられ、行と列の数が指定されます。

この配列のデータを ap::real_2d_array オブジェクトに格納する必要があります。

.

#4: ap::real_2d_array / オブジェクトを関数として取得します。

一次元配列doubleに変換して、行と列の数を取得する必要があります。

.

#5(テスト1、あなたがする必要はありません;-) :

1次元の配列を2次元の行列に変換する必要があります(手順1と同様)。

出来上がった行列をステップ1の元の行列と比較する。

ミスマッチの場合、それを把握する。

.

主に必要となるのは、機能3と機能4です。

ステップ1,2=トレーニング、このようにMqlにデータを詰め込む必要があります、ステップ5=テストです。

.

一般的には、5つのステップごとに機能を作っていくことになりますね。

.

Mqlにおける特異点変換。

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

 

この特異点分解アルゴリズムがどのように機能すべきかを詳細に説明していただき、ありがとうございます。項目1~3を実施。問題は4で、以前書いたようにエクスポート関数rmatrixsvd(...)を使った動作するDLLがまだ作れないからです。

C++のコードにextern "C" bool __declspec(dllexport) __stdcallrmatrixsvd(...)を追加すると、エラーが発生します...。boolrmatrixsvd(...)だけでコンパイルするとエラーにならないのに...。でも、エクスポート可能な 機能が必要なんだけど...。そこで混乱するのですが...。

ありがとうございました。

 

4について(他も含めて)。rmatrixsvdは関係ありません。

特異点分解アルゴリズムも同様です。これらの項目は、関連する

を使用して、Dllとの間でデータの送受信を行います。

.

item に書き込むプロトタイプ関数。4:

void Convert_real_2d_array_to_double()

const ap::real_2d_array & arr,

double * データ。

int & linesです。

int & columns

);

.

つまり、ap::real_2d_arrayから行数、列数、データ数を取得する方法を学ぶ必要があります。

.

これより

const ap::real_2d_array & arr

を手に入れる。

double * データ。

int & linesです。

int & columns

 

今回も大変ありがとうございました。

もう一度、すべての投稿を注意深く読み、ようやくどうすればいいのかわかったようです :-)。

確かに、ここではrmatrixsvd関数自体が「仕事道具」のようなもので、わざわざ書き出そうとする必要はないのですが。

時間通りにカートに荷物を載せて、配達されたらそっと正しい場所に降ろせばいいだけです

を、比喩的に言えば、目的地まで運んでくれるのです。今、私はあなたのことを正しく理解していますか?

つまり、これらのデータコンバータ(3および4)をC++で作成し、MQLで動作させる必要があるのです。

はエクスポート可能であると宣言され、Metatraderがそれらを使用できるようになります。私の問題は正しく理解されていますか?

もしそうなら、そして今理解できたと思うのですが、その時は2次元配列と1次元配列のリンクの仕方がよくわからなかったので、さらに良いですね。

さらに、MQLでは配列を[ ][ ]で宣言することはできませんよね?つまり、少なくとも配列はa[ ][100]と宣言されるべきなのです。そうなのか、それとも私の思い違いなのか?

また、2次元配列の次元がどうなるか事前にわからないため、あまり便利ではありません。一方、配列のためにあらかじめメモリを確保することは、ベストな方法とは言えません。

しかし、C++ではそのような問題はないのですね。 ですから、2次元配列は比喩的に「ゴム」と呼ばれることがあります。そうなんですか?それともC++にも微妙なところがあるのでしょうか?

Borland Builder 2009についてもお聞きしたいのですが。もしかして、6thほど不具合はない?実際に作業することは可能なのでしょうか?

だってalsuは 知る限りでは知恵遅れって言ってたし。:-)しかし、私が理解した限りでは、あなたはVisual Studioを使ってプログラミングしているのですね?涼しくなった?不具合もなく?今現在の最新バージョンは?

皆さんの協力で問題の真相がわかってよかったです。あとは、全部実装してみるか...。

 
boysn >> :

特にMQLでは配列を[ ][ ]で宣言することはできませんよね?つまり、少なくとも[ ][100]と宣言しておく必要があります。そうなのか、それとも私の思い違いなのか?

また、2次元配列の次元がどうなるか事前にわからないため、あまり便利ではありません。一方、配列のためにあらかじめメモリを確保することは、ベストな方法とは言えません。

素晴らしい:-)プロセスがどこかに向かっていることがとてもうれしいです :-)。

.

もちろん、Mql4では2次元配列の宣言も可能です。

また、同じようにDLLから関数をインポートすることもできます

#import myLib

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

#インポート

.

C言語では、1次元の配列を受け取る関数を宣言します。

行と列の数 void showMatrix(double *array, int rows, int cols);

そして、その配列は1次元配列として動作し、その中のアドレスはループ状に配置されます。

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

.

つまり、Mqlは連続したバッファを持つ2次元配列を投げるのである。

.

ただ、同じ熊手を踏まないでください - ステップ3と4の関数は、あなたのDllの内部で使用されています。

Mql から行数/列数の一次元配列を受け取る Dll-ins のインターフェース関数の内部。

ap::real_2d_array に変換し、rmatrixsvd に渡す。

で,その結果を出力バッファに格納します。出力バッファは,正しい行と列を持つ必要があります。

は正しくなければなりません。

.

もちろん、出力バッファはあらかじめ予約しておく必要があります - Mqlで行う必要があります。

寸法がわからない場合は、私の意見としては、「作るべき」です。

高次元の一次元配列、例えば

double out[2500] です。

と,行/列の出力値を表す1要素の配列です.

double raws[1]です。

double cols[1];

.

Visual Studioの方がかっこいい。特にビジュアルアシストでは。DebuilderでSTLがどのように動作するのかわからない。ユニコードには、ほぼ100%問題があります。

Win SDKのヘルプは、MSDNの比ではない。噂では、delphiと統合するために、ボーランドのコンパイラが

のプラスはノンポジで変化しています。

.

そして、記憶への働きかけは、授業のテーマにもなります。

 

理論的にはすべてクリアしているようなので、実装に取り掛かって、それからですね:-)。"目は怖くても手は動く..."

また、貴重なご指導をありがとうございました。このアルゴリズムをぜひ実装したいのですが...。例によって、戦略的にはすでに遠いところにあるアイデアですが、戦術的、実用的には

追いつかなければならないのです。と願っています。わからないことがあれば、遠慮なく相談にのってください。ありがとうございました。

 

ダイナミックアレイの次元性について、今一度明確にしたいと思います。

MQLでは、1次元の配列をarray[ ]と定義し、プログラムがその配列の次元Nを知ることができます。

を使用すると、ArrayResize(array, N)関数を使用することができます。2次元の配列は,array[ ][100]のみで定義できる,つまり2次元の

はすべて知っておくべきであり、知らなければ最大値をとるべきであり、いかなる場合でもそれで十分であろう。MQLで定義することができます。

array[ ][ ]です。 コンパイラは文句を言いませんが、ArrayResize 関数は配列の最初の次元に新しいサイズを設定 します。

MQLには、2次元目用のそのような関数はありません。2次元の配列array[N][M]を定義すると、コンパイラは次のようなエラーを返します。

は整数,つまり,少なくとも配列の 2 次元はあらかじめ定義しておく必要がある.

C++でも同じなのでしょうか?逃げ場がないんですよね。もう一度、はっきりさせておきたい。

特異点分解はAP Library for C++を使用します(説明は添付ファイルにあります)。私が理解した限りでは、この中にいくつかの機能があり、それを解決しています。

配列の動的1次元と2次元の問題。私の場合、データコンバータを書くときにDLL内部で使うことはできますか?

void setbounds(int iLow1,int iHigh1,int iLow2,int iHigh2)
配列のメモリを確保する.

新しい配列の要素番号は,1次元目がiLow1から始まりiHigh1で終わり,2次元目も同じです.

また、以下の機能もあります。

void setcontent(int iLow1,int iHigh1,int iLow2,int iHigh2,const T *pContent)
このメソッドは、メモリ確保後にpContent[]配列の内容がコピーされることを除き、 setbounds()method と同様です。
pContent配列には2次元配列が行単位で書き込まれ、すなわち、要素 [iLow1, iLow2] が最初に、次に [iLow1, iLow2+1] などのようになります。
.

私が正しく理解していれば、これはまさに私が必要としている関数、つまり1次元の配列から2次元の配列を作る、つまり本質的には変換器なのです。

うまくいったかな?

 

C++用APライブラリ

 
C++用APライブラリ
ファイル:
 

MQL : 一次元では、好きなように次元を変えることができますね。そして、インデックス(line * MAX_COL + col)ですべてを取得します。

2次元では、2次元は固定されています。つまり,配列a[100][100]から行列要素[15][32]を読み出すことはできない.

.

そして、APライブラリの機能がどのように動作するのかを確認することをお勧めします。

Dllで終わらせない。exeを書けば、実行もデバッグも簡単だ。

デバッグプリントを 挿入する。

確かにアドバイスはできますが、アドバイスにはテストが必要なんです。

テストコードを書く。

.

配列の内容や変数については、どこであろうと-。

強制的に、厳密に初期化することをルール化したほうがいい。