ライブラリ: TypeToBytes - ページ 3 1234567 新しいコメント --- 2017.02.11 15:16 #21 はい fxsaber 2017.02.13 19:43 #22 同じものを3行Color = (color)ColorToARGB(Color, Alpha); Color = (color)((Color & 0xFFFFFF) + (Alpha << 24));_W(Color)[3] = Alpha; fxsaber 2017.03.07 13:57 #23 取引、自動取引システム、取引戦略のテストに関するフォーラム MQL4に関する初心者の質問、アルゴリズムとコードに関するヘルプとディスカッション fxsaber, 2017.03.07 13:55#include <TypeToBytes.mqh>template <typename T>void Swap( T &Value1, T &Value2 ){ const T Tmp = Value1; Value1 = Value2; Value2 = Tmp;}// 任意の単純な型の配列をソートするtemplate <typename T>bool MyArraySort( T &Array[] ){ if (!ArraySort(Array)) { const int Size = ArraySize(Array); for (int i = 0; i < Size - 1; i++) { const T Tmp = Array[i]; for (int j = i + 1; j < Size; j++) if (_R(Tmp) == Array[j]) // TypeToBytes.mqh { Swap(Array[i + 1], Array[j]); i++; } } } return(true);} Libraries: TypeToBytes MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 Any questions from newcomers fxsaber 2017.04.03 01:48 #24 配列でのバイト単位の操作も追加// 配列を扱う short Array[] = {1, 2, 3}; ArrayPrint(_R(Array).Bytes); // 配列Arrayをバイト単位で表示する PRINT((_R(Array) == _R(Array).Bytes)) // バイト単位の配列比較が機能することを確認する。 _W(Color) = Array; // 配列をバイト単位でColorに書き込む PRINT(Color) // ColorがC'1,0,2'になっていることを確認する。 ArrayPrint(_R(Color).Bytes); // カラーをバイト単位で表示する uchar Array2[]; ArrayCopy(Array2, _R(Tick).Bytes); // Array2にTickのバイト表現を書き込む PRINT((_R(Tick) == Array2)) // TickとArray2が1バイトずつ一致することを確認する。 MqlTick Tick2 = {0}; _W(Tick2) = Array2; // Array2の配列をTick2に書き込む PRINT((_R(Tick) == Tick2)) // TickとTick2が一致していることを確認する。 int Array3[] = {INT_MIN, INT_MAX}; ArrayPrint(_R(Array3).Bytes); // Array3配列のバイト単位の表現を表示する ArrayPrint(_R(Array).Bytes); // 配列Arrayをバイト単位で表示する _ArrayCopy(Array3, Array); // 配列Arrayを配列Array3に1バイトずつコピーする ArrayPrint(_R(Array3).Bytes); // Array3 配列のバイト表現が、以下の式と一致することを確認する。 fxsaber 2017.04.03 12:36 #25 文字列のバイト単位の操作も追加// 文字列を扱う string Str = "abcd"; _W(i) = Str; // 文字列を(int)iに1バイトずつ書き込む PRINT((_R(i) == Str)) // int と sring のバイトごとの比較 ArrayPrint(_R(i).Bytes); // バイトiを検索 ArrayPrint(_R(Str).Bytes); // Strバイトを見る PRINT(_R(Str)[(short)1]) // Strのミックス1でショート値を取る。 PRINT(Str) _W(Str)[2] = "98765"; // 文字列をオフセット2の文字列にバイト単位で書き込む。 PRINT(Str) string StrArray[] = {"123", "45", "6789"}; _W(Str) = StrArray; // 文字列配列を文字列に書き込む PRINT(Str) _W(Str)[3] = (uchar)0; // オフセット3のバイトにゼロが書き込まれ、文字列(長さ - 3 ANSI文字(4バイト))が切断される。 PRINT(Str); fxsaber 2017.04.03 16:13 #26 取引、自動取引システム、取引戦略のテストに関するフォーラム ライブラリ:DLLなしのファイルマッピング fxsaber, 2017.04.03 16:07 ライブラリの作者に感謝します!任意のデータを転送するための関数を作りました。以下のスクリプトは、ティックの例でその働きを示しています。#include <MemMapLib.mqh> #include <TypeToBytes.mqh> // データ用に指定された長さのメモリを確保する。 template <typename T> bool GetFileMemory( CMemMapFile* &FileMemory, const int Amount, const string FileName = "Local\\test" ) { FileMemory = new CMemMapFile; return(FileMemory.Open(FileName, sizeof(T) * Amount + sizeof(int) + HEAD_MEM, modeCreate) == 0); } // データをメモリに書き込む template <typename T> void DataSave( CMemMapFile* FileMemory, const T &Data[], const bool FromBegin = true ) { const int Size = ArraySize(Data) * sizeof(T); uchar Bytes[]; _ArrayCopy(Bytes, _R(Size).Bytes); // 数量を記録 _ArrayCopy(Bytes, _R(Data).Bytes, sizeof(int)); // データを記録 if (FromBegin) FileMemory.Seek(0, SEEK_SET); FileMemory.Write(Bytes, ArraySize(Bytes)); // すべてをメモリにダンプ return; } // メモリからデータを読み込む template <typename T> int DataLoad( CMemMapFile* FileMemory, T &Data[], const bool FromBegin = true ) { if (FromBegin) FileMemory.Seek(0, SEEK_SET); uchar Bytes[]; FileMemory.Read(Bytes, sizeof(int)); // メモリからデータ量を読み込む FileMemory.Read(Bytes, _R(Bytes)[0]); // データそのものを取得 _ArrayCopy(Data, Bytes); // データを配列にダンプ return(ArraySize(Data)); } #define AMOUNT 1000 #define TOSTRING(A) #A + " = " + (string)(A) + " " // ティック送信の例 void OnStart() { CMemMapFile* FileMemory; if (GetFileMemory<MqlTick>(FileMemory, AMOUNT)) { MqlTick Ticks4Save[]; CopyTicks(_Symbol, Ticks4Save, COPY_TICKS_INFO, 0, AMOUNT); DataSave(FileMemory, Ticks4Save); MqlTick Ticks4Load[]; if (DataLoad(FileMemory, Ticks4Load) > 0) Print(TOSTRING((_R(Ticks4Save) == Ticks4Load)) + TOSTRING(ArraySize(Ticks4Save)) + TOSTRING(ArraySize(Ticks4Load))); FileMemory.Close(); } delete FileMemory; }結果(_R(Ticks4Save)==Ticks4Load) = true ArraySize(Ticks4Save) = 1000 ArraySize(Ticks4Load) = 1000技術革新の実用化例。 fxsaber 2017.04.05 00:32 #27 #include <TypeToBytes.mqh> // すべての配列文字列を1つの文字列にマージする string StringArrayConcatenate( const string &StrArray[] ) { string Str = ""; const int Size = ArraySize(StrArray); for (int i = 0; i < Size; i++) Str += StrArray[i]; return(Str); } void OnStart() { string StrArray[] = {"abcd", "123", "zxc", "890", "qwert"}; string Str1, Str2; // すべての配列文字列を1つの文字列にマージする Str1 = StringArrayConcatenate(StrArray); _W(Str2) = StrArray; Print(Str1); Print(Str2); }ハイライト - 同じ結果でも方法は大きく異なるabcd123zxc890qwert abcd123zxc890qwert fxsaber 2017.04.12 23:04 #28 アップデート後、利用可能になります// カスタム構造を設定する struct STRUCT { int i; // 代入演算子を設定する void operator =( const STRUCT& ) {} }; // ライブラリ関数によって_R構造体のカスタム代入演算子をバイパスした結果のデモ STRUCT Struct; // カスタム代入演算子を持つオブジェクトの作成 Struct.i = 1; ArrayPrint(_R(Struct).Bytes); // 代入演算子 PRINT(_R(Struct) == Struct) // ライブラリの_R機能には影響しません。 // 型代入演算子の「正しさ」をチェックする PRINT(_WRONG_ASSIGN_OPERATOR(int)) // 正しい PRINT(_WRONG_ASSIGN_OPERATOR(MqlTick)) // 正しい PRINT(_WRONG_ASSIGN_OPERATOR(STRUCT)) // 正しくない fxsaber 2017.04.13 13:34 #29 Определение корректности оператора присваивания структур.この機能が潜在的なエラーを検出するのに役立つ例。スクリプトを書いて実行する。#include <TypeToBytes.mqh> struct STRUCT { int i; STRUCT() : i(0) {} template <typename T> void operator =( T& ) {} }; #define PRINT(A) ::Print(#A + " = " + (string)(A)); void OnStart() { PRINT(_WRONG_ASSIGN_OPERATOR(STRUCT)) }結果が表示される。_WRONG_ASSIGN_OPERATOR(STRUCT) = trueこれは、代入演算子が構造体を同じ型の構造体にコピーしないことを示している。構造体にさらに追加しても void operator =( STRUCT &Value ) { this.i = 0; }結果は同じになります。この演算子を void operator =( STRUCT &Value ) { this.i = Value.i; }に修正すればすべてが正しくなるように思えるが、ライブラリはそうではないと言う。おそらく、これがこの例の最も微妙な点だろう。この演算子を#include <TypeToBytes.mqh> struct STRUCT { int i; STRUCT() : i(0) {} template <typename T> void operator =( T& ) {} void operator =( const STRUCT &Value ) { this.i = Value.i; } }; #define PRINT(A) ::Print(#A + " = " + (string)(A)); void OnStart() { PRINT(_WRONG_ASSIGN_OPERATOR(STRUCT)) }に直してみると_WRONG_ASSIGN_OPERATOR(STRUCT) = falseこれでコピー演算子が正しく書かれるようになった!同じような方法で、どんな単純な構造 体の代入/コピー演算子でも、その正しさをチェックすることができる。 fxsaber 2017.04.19 17:17 #30 NULL文字列と 空文字列の違いは何ですか?#include <TypeToBytes.mqh> #define PRINT(A) ::Print(#A + " = " + (string)(A)); void OnStart() { const string StrNull = NULL; PRINT(ArraySize(_R(StrNull).Bytes)) PRINT(ArraySize(_R("").Bytes)) }結果ArraySize(_R(StrNull).Bytes) = 0 ArraySize(_R().Bytes) = 1NULL文字列はバイト長ゼロです。空文字列は1バイト長です(ゼロは文字列の終端です)。 1234567 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
Color = (color)((Color & 0xFFFFFF) + (Alpha << 24));
_W(Color)[3] = Alpha;
取引、自動取引システム、取引戦略のテストに関するフォーラム
MQL4に関する初心者の質問、アルゴリズムとコードに関するヘルプとディスカッション
fxsaber, 2017.03.07 13:55
template <typename T>
void Swap( T &Value1, T &Value2 )
{
const T Tmp = Value1;
Value1 = Value2;
Value2 = Tmp;
}
// 任意の単純な型の配列をソートする
template <typename T>
bool MyArraySort( T &Array[] )
{
if (!ArraySort(Array))
{
const int Size = ArraySize(Array);
for (int i = 0; i < Size - 1; i++)
{
const T Tmp = Array[i];
for (int j = i + 1; j < Size; j++)
if (_R(Tmp) == Array[j]) // TypeToBytes.mqh
{
Swap(Array[i + 1], Array[j]);
i++;
}
}
}
return(true);
}
取引、自動取引システム、取引戦略のテストに関するフォーラム
ライブラリ:DLLなしのファイルマッピング
fxsaber, 2017.04.03 16:07
ライブラリの作者に感謝します!
任意のデータを転送するための関数を作りました。以下のスクリプトは、ティックの例でその働きを示しています。
結果
技術革新の実用化例。
ハイライト - 同じ結果でも方法は大きく異なる
この機能が潜在的なエラーを検出するのに役立つ例。
スクリプトを書いて実行する。
結果が表示される。
_WRONG_ASSIGN_OPERATOR(STRUCT) = trueこれは、代入演算子が構造体を同じ型の構造体にコピーしないことを示している。
構造体にさらに追加しても
結果は同じになります。
この演算子を
に修正すればすべてが正しくなるように思えるが、ライブラリはそうではないと言う。
おそらく、これがこの例の最も微妙な点だろう。
この演算子を
に直してみると
_WRONG_ASSIGN_OPERATOR(STRUCT) = falseこれでコピー演算子が正しく書かれるようになった!
同じような方法で、どんな単純な構造 体の代入/コピー演算子でも、その正しさをチェックすることができる。
結果
NULL文字列はバイト長ゼロです。空文字列は1バイト長です(ゼロは文字列の終端です)。