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
  • 66 follow us in feedly

関連記事

no image

招きねこさんによる無料EA配布!

こんばんは!キリンです。 今日は、私の親友の招きねこさんを紹介させていただこうと思います。 招き猫さんはブログで自らの手

記事を読む

no image

一時休止します・・・

こんにちは。キリンです。 最近MT4より他のプログラミングをすることが多く、 MT4を触ることが少ないのでネタが書けませ

記事を読む

no image

EclipseにRuby On Railを入れてデバックを開始するとエラーが起こる。

表示されたエラーがこれ。C:/Ruby192/lib/ruby/site_ruby/1.9.1/rubygems.r

記事を読む

no image

日本のFX業者はなぜスプレットが低いのか?

みなさんは考えたことはございますか? それを考えると、 なぜmixiを見ていても「スキャルピング」という言葉が そこらじ

記事を読む

no image

オプション向け 指定時間よりX分ごとにアラートを鳴らすソフト

外為オプションするなら、これがあると便利。使い方は説明不要だと思う。http://www.vector.co.jp/

記事を読む

no image

初記事

さくらでVPSを契約したので、ついでにサーバを構築してみた。案外快適?まだまだ使い勝手わからないので頑張ってみる。に

記事を読む

no image

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

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

記事を読む

no image

kconvを使っても文字化けするとき。

「㎡」がtosjisで文字化けしてしまった。そんな時は とかを使うと良いhttp://d.hatena.ne.jp/

記事を読む

no image

ポジションの平均pipsを計算するサブルーチン

おはようございます。キリンです。 実は愛用のノーパソが壊れちゃいまして、 一年以内なので保障修理に出すのですが外部に漏れ

記事を読む

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

Avoiding the problem of connect to outside of LAN with L2TP/IPSec on Ubuntu 18.04.

とても困って、原因の特定に2日かかった。疲れた。確定申告したいのに。 The IPSEC tu

Wine 上の MT4から ZeroMQ を使って Linux の pyzmq の通信をさせる

こんにちは。キリンです。 最近、年に数度のMQLを書くときがきたのですが、Pythonに慣れま

numpy の2つ行列で片方にあるものだけを抽出する。

numpy で2つの時間のインデックスをarrayデータとして持っていて、x にはない時間のイン

Synology DS216j の MySQL に外部からつなぐ

Synology DS216j をNAS(RAID1 12TB)として使っています。もっぱらデー

VMWare Player をヘッドレスモードで使う。

[bm url="http://www.ryanchapin.com/fv-b-4-713/Ru

→もっと見る

PAGE TOP ↑