Wizard In The Market
システムトレードの魔術師

*

MQLからC++ DLLへの参照渡しorポインタ渡し・・・。

公開日: : 最終更新日:2015/01/13 その他

おはようございます。キリンです。
マニアックなネタなので、ほとんどの人は興味がないと思いますが、
メモ代わりに記載しておきます・・・。
多分C++に詳しい人にとっては当たり前なのかもしれません><;
string型(char型)以外で、MQLからDLLへポインタ渡しすることは不可能なようです。
参照渡しは全ての型で不可能でした。
常にクリティカルエラーが表示されてしまい、MT4が落ちます。
さらに、MQLでstring型をDLLに渡すときは、
必ず前もって文字領域を確保しておかなければなりません。
たとえば、
string text = "123456789";
とすれば、char[10]に対応しますが、
string text = "1234"+"56789";
このようにすると、"1234"分、char[5]分しか確保されませんでした。
また、定義時に割り当てておかないと、全く確保されないようです。
さらに、同じ定数を割り当てると同一メモリに保存されてしまいます。
string text1 = "123456789";
string text2 = "123456789";
とすると、text1をDLLへ渡して、特定のメモリの値を変えてやると、
たとえば、DLL側でchar* text1としたとして、
*(text1+3) = ‘e’;
とすると、text2の表示も
"012e456789"
と3番目の表示が変わってしまいます。
まったく同じ定数を割り当てた変数は、同一メモリが使われているようです。
なので、メモリ確保するときは1文字でも違う定数を割り当てなければなりません。
具体的には、
string text1 = "123456789"
string text2 = "123456780"
のようにする必要がありました。
今はboolの結果が欲しいだけでも、string⇒char型にして無理やりDLLに渡しています。
この情報は誰かの役に立つのかな・・・
以上、参考情報でした。
お読みくださり、ありがとうございます。

にほんブログ村 為替ブログへ 
Fx-Kirin

About Fx-Kirin

2009年10月にFXを開始、翌年2010年5月から脱サラをしてFX業界に専念。 2012年10月頃から本格的に勝ち始め、一月で資産を倍にする、2年半月間負けなし等、安定した収支で2013年11月に生涯FX収支が1億を超える。 投資スタイルはシステムトレード。プログラミングの知識がほぼない状態から、独学で自分がしたいと思うことであればほぼ実現することが可能なレベルまで成長。好きな言語はRuby, Python。必要となればC++からVBA、Pascal等なんでも行う。MT4/MT5のプログラミングも得意。 2011年にはFXで稼いだ資金をもとにシンガポールに移住し、留学も兼ねて起業をチャレンジするほど、ビジネスを興すことに熱意がある。国内の業者を主に使い始めたことから、2012年に帰国。零細株式会社経営中。

Adsense

  • このエントリーをはてなブックマークに追加
  • Pocket
  • 67 follow us in feedly

関連記事

UX21A のディスプレイが壊れたので修理

UX21A のディスプレイがぶっ壊れた。 画面にラインが入ったり、ディスプレイが揺れたりするようになりました。最終

記事を読む

no image

7bit氏作成 MQLライブラリー解析 part13

こんばんは。キリンです。 今日ご紹介するのは、予約注文の変更を簡単にするものです。 moveStopのみ、stop

記事を読む

no image

dovecotの設定

http://www.kazutoyo.com/ubuntu/?page_id=391sudo apt-get in

記事を読む

no image

11/3運用結果

<colgroup> </colgroup>バイナリオプション日付曜日取

記事を読む

no image

トレンド・チャネル内での取引用EAが完成しました

こんばんは。 日曜日を潰してEAの作成に没頭しておりました。 今日の目標はとりあえず達成。 ExpertAdvisorと

記事を読む

no image

uninitialized constant Rake::DSL rails 3.2.1

なんかあちこちで rake-0.8.7 を使えという記述を見てきましたが、全然動かなかった。rake 0.9.2.2

記事を読む

no image

ポジションのないInteractive Brokersより強制決済(ロスカット通知)のメールがあった

こんばんは。Kireekです。久しぶりに真面目なFXネタ。いつもは口座の資金情報くらいしかメールのこないIBさんから

記事を読む

no image

High_Low v2 (ZigZag)のバーが出るタイミング

こんばんは!キリンです。 今ドラマ見てたら良いセリフ聞きました。 単調な仕事をする町工場に社員として働き出した新社会人

記事を読む

no image

感謝の気持ち。(アメンバ限定で申し訳ないです^^;)

こんばんは。キリンです。 優さんからすごく嬉しいメッセージをいただいたので、ご紹介させていただければと思います。 非常に

記事を読む

no image

プログラムの得意な部分とシステムトレード

こんばんは。キリンです。 キリンがついに裁量トレードに本格的に手を出します。 何度かチャレンジしては没落(?)してきた僕

記事を読む

Comment

  1. SECRET: 0
    PASS:
    おぉ。
    この話はどっかのブログで見た事あるな。
    そんなところまではまだ手が出ないっすが、これからの為に押さえておきます!!

  2. tommy より:

    SECRET: 0
    PASS:
    ・変数宣言時の演算子の優先順位
    ・キャストとポインター操作
    プログラマは、不可解な謎の答えは自分自身で見つけ出すものですからここに答えは書きません。
    自分で問題解決した後のαテストが一番楽しいですね。

  3. SeaStar より:

    SECRET: 0
    PASS:
    配列にすれば行けます。
    【MQL4】
    #import "TestBool.dll"
    void TestBool(bool b[], int);
    #import
    bool b[] = { true };
    TestBool(b, ArraySize(b));
    if(b[0])
    {
    Print("true");
    }
    else
    {
    Print("false");
    }
    【DLL】
    MT4_EXPFUNC void __stdcall TestBool(bool b[], int size)
    {
    if(b == NULL)
    {
    return;
    }
    if(size < 1)
    {
    return;
    }
    b[0] = false;
    }
    何だか良く分からないですが、こんなことするぐらいであれば、戻り値で受け取った方が良い気がするのですが…。
    MQL4ではこういう仕様の様ですね。
    intやdouble等でも同様です。

  4. SECRET: 0
    PASS:
    >SeaStarさん
    アドバイスありがとうございます。
    配列でできるのは分かるのですが、
    やりたかったのは「参照渡し」なんですよ^^;
    それができなかったので苦肉の策でポインタ渡しにしようと思ったわけです。
    bool型は値の受け渡しも、関数の戻り値に指定した場合もDLLへ正常に受け渡しできないことも判明しました・・・。
    結構色々問題がありそうですね。

  5. SeaStar より:

    SECRET: 0
    PASS:
    >本気のFX部長! Kirin@FTLさん
    >やりたかったのは「参照渡し」なんですよ^^;
    恐らくそうだと思うんですが、MQL4でいう配列のみ参照渡し出来ない仕様なんだと思います。
    問題ではなく仕様なんだと思います…。
    違ったら申し訳ないです。
    ポインタ渡しってつまり値渡しですよね^^;
    値渡しはそもそも代入不可なんではないでしょうか。

  6. SECRET: 0
    PASS:
    >SeaStarさん
    ポインタ渡しは値渡しではないです。
    メモリのアドレスを渡すという形なので、参照先で値を変更させればメモリの中身が変わり、関数を抜けても値が変わった状態で出力されます・・・。
    MQLのstring型からDLL側のchar型のみ、ポインタ渡しが可能みたいです。

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Adsense

PYPIへの登録を10秒でできるようになる方法

pip 使ってますよね Pythonを使っている人であれば、pip installでライブラリ

The art of debugging with GDB, DDD, and Eclipse の読書メモ

GDBの勉強がしたくて、下の本を原著で読んでみました。10年前の本だけど全然現役でした。

JupyterでボタンからJavascriptを実行して追加のアウトプットをさせない方法

Javascriptを実行するとアウトプットセルの行が増える これがとても面倒だった。上の

まだBokehで消耗してるの?これからはPandas-Bokehを使おうぜ

タイトルはあまり気にしないでください。全然、Bokehで消耗する価値があるとは思っています。ただ

SQLAlchemy のマイグレーションライブラリ Alembic を使ってみる。

SQLAlchemyの作者が作ったデータベースマイグレーションツール。個人的には、SQLAlch

→もっと見る

PAGE TOP ↑