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

関連記事

no image

人は信念によって動かされて文明を作ってきた

おはようございます。 ちょっと面白い内容を読んだので、ご紹介。 今まで偉大な人物として名を残している ほとんどすべての人

記事を読む

no image

ブログのお引越し。

はてなからの出戻りです。Wordpressのメンテナンスが面倒になりました・・・orzさくらの最安値サーバでやってたか

記事を読む

no image

最小二乗法を用いたトレンドラインのアレンジ版の作成

自分でいうのもなんですが、かなり使えると思います。 私の知っているトレンドラインを自動で引くものの中では 一番精度がいい

記事を読む

no image

Rails3での add_to_base Active Reacord

use model_instance.errors << “Msg” instead of depr

記事を読む

no image

11/1のFXの成績

趣味でFXをしているので、その成績を今日からまとめていきたいと思います。そのぐらいしないと、資金管理なんてできないよ

記事を読む

no image

11/15 運用結果

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

記事を読む

no image

【日記w】シンガポールへ留学します。

こんばんは。キリンです。 今の状態は、起きてパソコン付けて、必死にプログラムつくって、 インジケータの統計とって、どれが

記事を読む

no image

11/13, 14 運用結果

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

記事を読む

no image

成功を収めた社長のセミナー

皆さん、お疲れ様です。 FX関連のブログとして停滞気味ですね。 「こういうの書いて!」とか 「この方向性は嫌だ!」みたい

記事を読む

no image

zlib 1.2.5 コンパイルして rubyにインストールするとき[Windows]

checking for deflateReset() in z.lib... nochecking for def

記事を読む

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

joblib によって謎のバグが起こる

joblib 0.14.1 にて確認.0.13.2 だと起こらない.import joblib を消

Fixing kernel error AMD-Vi: Event logged IO_PAGE_FAULT on Ryzen Machine

My pc was periodically shut down on 7:40 am JS

Ubuntu で仮想ディスプレイを使う

雑多な備忘録ですが、せっかくなので残しておきます。 Ubuntu 18.04 の resolv.c

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

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

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

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

→もっと見る

PAGE TOP ↑