プログラミング初学者です。
現在MQL4を学んでいます。下記処理はインジケータの名前を作成する関数で、下記のように理解しているのですが、誤った理解があればご指摘頂きたく、よろしくお願いします。
また、string name = target;の意味がうまく理解できず、アドバイス頂けると幸いです。
MQL4
1string GenerateIndicatorName(const string target) 2{ 3 string name = target; 4 int try = 2; 5 while (WindowFind(name) != -1) 6 { 7 name = target + " #" + IntegerToString(try++); 8 } 9 return name; 10}
●インジケータの名前を作成する関数
文字列targetを引数として渡し、GenerateIndicaterNameを返す関数。OnCalculate関数と同様の構文。
string型のnameを定義し、そこにtarget変数を代入。←この処理の意味がうまく理解できません。。
int型の変数tryを定義し、2を代入。
whileでインジケータの名前が見つかるまでループ。見つかったら文字列target#3(2をインクリメント)を返す。
備考
//WindowFind…インディケータのname(名前)を引数として渡し、指定されたインディケータを含んでいるウィンドウインデックス(ウィンドウ番号)を返す。それ以外の場合は、-1 を返す。
//IndicaterToString…int型のデータを指定した長さの文字列に変換する。
以下、xg63ex2bさんへの追記内容となります。
●引数について
”関数が受け取る変数が引数”、となるのですね。
string name = target;では、
”name変数にtargetを割り当てる処理”であるため、引数とはまた意味が違ってくるのだと解釈いたしました。
●while (WindowFind(name) != -1)の条件式について
(WindowFind(name) != -1)
↓
-1(ウィンドウ番号が返されないとき)じゃないとき=ウィンドウ番号が返されるとき
↓
ウィンドウ番号が返されるときに、
name = target + " #" + IntegerToString(try++);
が実行される。
否定の否定となるため、WindowFind()関数でインジケータの名前が見つかったら処理が実行されるということだと解釈しました。
●name = target + " #" + IntegerToString(try++);が実行される条件について
1回目の判断では、while (WindowFind(name) != -1)の条件式が実行される前の
string name = target;によってname変数が定義される。
(すでにmoving averageが存在しているものとする。)
従ってmoving averageが返される。
2回目の判断では、while (WindowFind(name) != -1)以降の条件式となる。
すでにmoving averageが存在しているため、
while (WindowFind(name) != -1)の条件式が実行される。
ここでname変数への再代入がされるが、この場合は後置インクリメントとなり、
まず最初にtry変数に代入されていた「2」を使ってname変数への再代入の処理を行う。
そのため、name変数は"moving average #2"となる。
インクリメントをはき違えて理解していました。
以降、xg63ex2bさんのご指摘の内容となるのですね。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2022/03/06 15:44
2022/03/07 15:17
退会済みユーザー
2022/03/09 09:12
2022/03/10 13:52