MQL4の新しい構文 - ページ 4

 
その通りです。よほどのことがない限り、私のコードにはbool, int, double, stringしか出てきません。そうでなければ、このインデックスに近づくすべての整数をキャストする必要があります。
 
RaptorUK:

uchar - 符号なし文字、なぜこれをループに使うのでしょうか? 私には意味がわかりません。 あなたはulongsを扱うことになります、それは新しいdatetimeがそうであるように・・・そして将来あなたがそれを考えずにタイプキャストしたとき、あなたは警告を受けるでしょう・・・警告に対処するか、それを無視するか。 しかし、ただベストを望むだけでなく、あなたが今しているように、学び、理解することです。

あなたがstackoverflowから投稿したものは、私には意味があります、私はそれが良いアドバイスだと思います。

ucharは0から255までの8ビットの正の値なので、0から100までのループでは、32ビットの整数の代わりに8ビットのucharを使うことができますよ。
 
SDC:
ucharは0から255までの1バイトの正の値なので、0から100までのループには1バイトのucharを使用することができます。
しかし、なぜそんなことをするのでしょうか? それは動作しますが、なぜ文字値用の変数型をループカウンターに使うことが論理的に正しいのでしょうか?

もし、関数から 返された値を保存する必要があり、その関数がucharを返す場合、uchar変数を使用して返された値を保存してください ... オリジナルのmql4ではこれは問題ではありませんでしたが、新しいmql4ではより問題になるでしょう。
 

この質問をしたとき、私はなぜそうしたいのかわかりませんでした。

8ビットの変数型が32ビットより速く処理できるのか、遅いのか、同じなのか、8ビットの値がより少ないRAMやディスクスペースを使用するのか、わかりませんでした。

私は、32ビットOSが4つの8ビット値を同時に処理できると思っていたのですが、そうではありませんでした。どうやらそうではないらしい。これで、64ビットOSが32ビットよりも高速でない理由がわかりました。より多くのRAMにアクセスできるという事実を除けば、です。私はこのことをよく不思議に思っていました。

 

私は、解決策が見つからない質問があります。

どのようにvoid&を 使用するのですか?つまり、私はDLLに任意のポインタを送信する必要がある場合。ヘルプファイルには、このvoid型を使用する関数が ありますが、ソースのどこかに配置すると、それはコンパイルされません。テンプレートで回避しようとしましたが、#import文の中でテンプレートは禁止されています。

単一型のコンストラクションは何とかなったのですが、void&の配列ポインタをDLLに渡すには、明示的に型を指定しないと実装できないようです。

int  FileReadArray(
   int    file_handle,               // File handle
   void&  array[],                   // Array to record
   int    start=0,                   // start array position to write
   int    count=WHOLE_ARRAY          // count to read
);
 
 

DLLに構造体の配列を渡す場合、何か制限があるのでしょうか?

MT4Structure が単純な構造体 であるとします

kernel32.dllをインポート したところ、単一の構造体であれば問題なく動作します。

bool ReadFile(
    /*_In_         HANDLE*/ int hFile,
    /*_Out_        LPVOID*/ MT4Structure& lpBuffer,
    /*_In_         DWORD*/ uint nNumberOfBytesToRead,
    /*_Out_opt_    LPDWORD*/ uint& lpNumberOfBytesRead[],
    /*_Inout_opt_  LPOVERLAPPED*/int lpOverlapped
);

しかし、構造体の配列を渡すとうまくいきません。この宣言のパラメータとして MT4Structure&[] を送ると、コンパイラがコンパイルしてくれません。

bool ReadFile(int, MT4Structure&[], uint, uint&[],int);
 
Ovo:

DLLに構造体の配列を渡す場合、何か制限があるのでしょうか?

このようなもので問題があるとは思えません。

struct TestStruct {
   int Integer;
   uchar Byte;
   double Real;
};

#import "ExampleDllWhichReceivesStructureArray.dll"
   void Test(TestStruct &[]);
#import 

MT4とDLLで異なるデフォルトの構造体アライメントを許容する場合)期待通りに動作します。

(ちなみに、MQL4のboolの内部表現がどうなっているかはわかりませんが、私はWin32関数は intを返すと宣言した方が良いと思っています。Win32関数はC++のboolではなく、BOOLを返します。BOOLは4バイトの整数を表すWindowsのマクロで、その値は1/0ですが、C++のboolは1バイトです。関数が実際には4バイトを返すのに、MT4に1バイトの戻り値を期待するように指示した場合、非常に低い確率ですが、スタック破壊に至る可能性があります)。

 
Ovo:

void&の 使い方は?つまり、DLLに任意のポインタを送る必要がある場合です。

質問の意味がよくわからないのですが。例えば、Win32 APIのドキュメントでは、void*を「これはあらゆるタイプのポインタを受け付ける。Win32の関数は、あなたのメモリブロックが何であるかを気にしない」という意味で使っています。

 
gchrmt4:

質問の意味がよくわからないのですが。例えば、Win32 APIのドキュメントでは、void*を「これはあらゆるタイプのポインタを受け入れる。Win32の関数は、あなたのメモリブロックが何であるかを気にしない」という意味で使っています。


その通りです。しかし、MQL4ではそれがなかなかできないようで、#importブロックの中でテンプレートを使うことはできません。つまり、winapiで追加の構造を 使用すると、新しい型が必要になるたびに#import宣言を手動で更新することになります。私の目的は、インポートを一箇所で管理することなので、これは私にとってかなり不都合なことです。
 
Ovo:

その通りです。しかし、MQL4ではそれがなかなかできないようで、#importブロックの中でテンプレートを使うことができません。そのため、winapiで追加の構造を使用すると、新しい型が必要になるたびに#import宣言を手動で更新することになります。これは、私にとってはかなり不愉快なことです。
まだ理解できていませんが...。MQL4のimport はvoid*と宣言することはできないと思います。インポートで特定のデータ型を使う必要があり、そのデータ型ではDLLインポートしか使えません。もし、同じDLL関数を異なるデータ型で使いたい場合は、https://www.mql5.com/en/forum/148934 のような回避策がない限り、問題が発生します。