MQL4プログラミングに関するオンラインブックのベータ版 - Sergey Kovalev (SK.)著 - ページ 10 1...3456789101112 新しいコメント A_K_M 2008.01.29 07:50 #91 すみません、見つけました! 確かにマニュアルはとても格好いいのですが、先ほどのリクエストに戻りますと、手元ですぐに調べられる必要があるのです。 理想は - MTの新しいバージョンで標準のヘルプを置き換えることです。 Aleksandr Pak 2008.01.29 08:57 #92 からSK double my_search_and_etc() { double summ[]; //関数内の配列 //......... i=ArrayMinimum(sum,iter,0); // トレーサー:<ArrayMinimum関数の 開始位置0をインクルード>。 //2つ目のエラーバリアント static double summ[]; // //......... i=ArrayMinimum(sum,iter,0); // トレーサー:<ArrayMinimum関数の開始位置0をインクルード>。 //2回目のクリックで配列の初期要素の動的アドレス指定に失敗した場合 //....................... //........................ |タイミング double summ[1000]; //サイズを明示的に指定することでstatic型を意味する //......... i=ArrayMinimum(sum,iter,0); // O.k. //右2つ static double summ[1000]; //明示的なサイズへの再保険 //......... i=ArrayMinimum(sum,iter,0); // O.k. } Sceptic Philozoff 2008.01.29 09:00 #93 いいえ、標準のヘルプを差し替える必要はありません。持っててください。通常の言語ソフトの開発者は、言語記述とそのための様々なチュートリアルを分けて考えています。 Сергей Ковалев 2008.01.29 09:43 #94 Korey: からSK 質問の意味がよくわからないのですが。あなたが提供した文字列のセットは完全なコードなのか(それならなぜ初期化が繰り返されているのか)、それともクズな文字列なのか(それならなぜ中括弧があるのか)。完成したコードを提出し、問題を作成する。コードを公開するには、MQLボタン(編集ウィンドウの最上行)を使用します。 Сергей Ковалев 2008.01.29 10:03 #95 Renat: セルゲイ・コバレフ選手、おめでとうございます。 MQL4チュートリアルの リリースは2月1日を予定しており、すでにMQL4.communityのサイトに統合されています。英語への翻訳も順調に進んでいます。 レナートさん、お祝いのお言葉ありがとうございます。 この場をお借りして改めて、MetaQuotes Software Corp.の ウェブサイトにMQL4チュートリアルを掲載できたことを大変光栄に思っています。皆様の信頼とご支援、ご鞭撻に心より感謝申し上げます。また、本書の作成にあたり、MetaQuotes Software Corp.のStanislav Starikov氏とRashid Umarov氏には貴重なアドバイスとご協力をいただいた。 Aleksandr Pak 2008.01.29 12:19 #96 からSK この記事では、1つの同じArrayMinimum()の呼び出しで、4種類の配列の初期化を示しています。 配列のサイズ [] を指定せずにサブプログラムで配列を初期化すると、「RunTime」エラーが発生することが示されている - 最初の2つのバリエーションでは、エラーが引用され、翻訳では、"配列の先頭の不正なADDRESS "となります。 -2番目の2つのバリエーションが動作しており、次元数を[1000]に指定すると自動的に静的配列になることが示されています。 結論 1) MQL4の配列は常に静的とは限りません。 2) 静的な a[] の定義、すなわち次元を明示しない定義は動作しませんが、エラーメッセージは出ません。Expert Advisorウィンドウの2回目以降のティックで、実行時にエラーが表示されます。 3) 静的/動的エラーは、配列がサブ/ファンクで定義されている場合に表示され、エキスパートアドバイザ画面を見た人だけがキャッチできるようにしました。 で、2回目のダニが来たときだけ。例えば、ストラテジーテスターを使用せず、週末にインジケーターのデバッグを行った場合、エラーは検出されません。 4) 教科書の一節「MQL4の配列は常に静的です」は、以前のビルドと関係があるのかもしれません。 Prival 2008.01.29 12:27 #97 テキストチュートリアルに加えて、ビデオチュートリアルのセットも欲しいです。ビデオチュートリアルのセットを用意する。特に欠けているのは、プログラムをダウンロードし、インストールし、最初の買いまたは貝の取引を行う方法という、非常に最初のレッスンです。 Сергей Ковалев 2008.01.29 12:42 #98 Korey: からSK この記事では、1つの同じArrayMinimum()の呼び出しで、4つのバージョンの配列の初期化を示しています。 配列のサイズ [] を指定せずにサブプログラムで配列を初期化すると、「RunTime」エラーが発生することが示されている - 最初の2つのバリエーションでは、エラーが引用され、翻訳では、"配列の先頭の不正なADDRESS "となります。 -2番目の2つのバリエーションが動作しており、次元数を[1000]に指定すると自動的に静的配列になることが示されています。 結論 1) MQL4の配列は常に静的とは限りません。 2) 静的な a[] の定義、すなわち次元を明示しない定義は動作しませんが、エラーメッセージは出ません。Expert Advisorウィンドウの2回目以降のティックで、実行時にエラーが表示されます。 3) 静的/動的エラーは、サブ/ファンで配列が定義されている場合に表示され、Expert Advisorsウィンドウを見た人にのみ表示されます。 で、2回目のダニが来たときだけ。例えば、ストラテジーテスターを使用せず、週末にインジケーターのデバッグを行った場合、エラーは検出されません。 4) 教科書の一節「MQL4の配列は常に静的です」は、以前のビルドと関係があるのかもしれません。 理由があまり明確でないですね。無次元配列を宣言し(実際には、プログラムには配列の名前しかなく、その要素は定義されておらず、メモリも確保されていない)、ArrayMinimum()関数を使って、存在しない要素の中から最小値を見つけようとするのです。もちろん、配列のstatic宣言の有無にかかわらずエラーは発生しますので、実行エラーは配列のプロパティがstaticであるか否かを示すものとして扱う必要があります。 MQL4の配列は定義上、静的です。これは(もちろん,配列に少なくとも1つの要素があれば別ですが),配列の識別子の前にstaticキーワードがあるかどうかにかかわらず,(配列を宣言した)関数が最後に終了してから次に呼ばれるまで,配列の要素が保存されることを意味します. Aleksandr Pak 2008.01.29 13:00 #99 to SK どうでもいいけど、こういうメモリ割り当てのトリックは昔から使ってるんだよね。 配列の内容ではなく、そのアドレスについて、コンパイルエラーも リンクエラーもADDRESSのランダムエラーもないことを書きました。 つまり、サブルーチンの中で配列[]を定義して、後でそれを大きくすることをコンパイラが許可してくれたのです。 - それは良いことです(!)。 配列による動的メモリ割り当てです。 しかし、この配列へのポインタはすべて直接ポインタとしてリンクされる(ポインタへのポインタはリンクされない)ため、 、その後の動的メモリ割り当て時にリンクされた静的アドレスと新たに割り当てられた配列アドレスの間にミスマッチが発生することになります。 すなわち、MQL4での配列(ポインタ)参照は静的なものになり、本当に静的な配列である場合にのみ正しく動作するようになったのです。 コンパイラは、サブルーチン内部で明示的にサイズを指定しないと、将来的に配列が移動されることを理解できないのです。 プログラマはstaticを指定して、すべてが正しいと思っていますが、明示的にサイズを指定しなければ、static配列にはならず、実際には動的な配列になります(コンパイルや読み込みのエラーはありません)。 この問題はそれほど大きくはなく、通常、誰もがグローバルレベルでアレイを保持しています。 しかし、チュートリアルでは、すべての配列はすでに静的であるはずだ、ではなく、ローカルな配列はサイズを明示的に指定して静的に書きなさい、と書くことが望ましいです。 Сергей Ковалев 2008.01.29 13:33 #100 Korey: からSK プログラマはstaticを指定して、すべてが正しいと思っていますが、もし明示的にサイズを指定しなければ、static配列にはならず、実際には動的な配列になります(コンパイルやロードのエラーはありません)。 MQL4の配列がすべてstaticであることを知っているプログラマは、staticを置かないでしょう。 しかし、チュートリアルには、すべての配列はすでに static であるはずだ、ではなく、ローカル配列は static でサイズを明示的に指定すべきである、と書くことが望まれます。 おそらく、概念を混同しているのでしょう。この場合の "static "とは、宣言された関数の実行間隔において、配列要素の値を保存する性質を意味する。配列は、名前の前に static が付いていても、この間は常に値を保持します(ただし、ローカル変数には当てはまらず、明示的に static と宣言する必要があります)。 しかし、ArrayResize()を使えば、1次元の配列のサイズを変更することは可能です。 1...3456789101112 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
確かにマニュアルはとても格好いいのですが、先ほどのリクエストに戻りますと、手元ですぐに調べられる必要があるのです。
理想は - MTの新しいバージョンで標準のヘルプを置き換えることです。
からSK
double my_search_and_etc()
{ double summ[]; //関数内の配列
//.........
i=ArrayMinimum(sum,iter,0); // トレーサー:<ArrayMinimum関数の 開始位置0をインクルード>。
//2つ目のエラーバリアント
static double summ[]; //
//.........
i=ArrayMinimum(sum,iter,0); // トレーサー:<ArrayMinimum関数の開始位置0をインクルード>。
//2回目のクリックで配列の初期要素の動的アドレス指定に失敗した場合
//.......................
//........................
|タイミング
double summ[1000]; //サイズを明示的に指定することでstatic型を意味する
//.........
i=ArrayMinimum(sum,iter,0); // O.k.
//右2つ
static double summ[1000]; //明示的なサイズへの再保険
//.........
i=ArrayMinimum(sum,iter,0); // O.k.
}
からSK
質問の意味がよくわからないのですが。あなたが提供した文字列のセットは完全なコードなのか(それならなぜ初期化が繰り返されているのか)、それともクズな文字列なのか(それならなぜ中括弧があるのか)。完成したコードを提出し、問題を作成する。コードを公開するには、MQLボタン(編集ウィンドウの最上行)を使用します。
セルゲイ・コバレフ選手、おめでとうございます。
MQL4チュートリアルの リリースは2月1日を予定しており、すでにMQL4.communityのサイトに統合されています。英語への翻訳も順調に進んでいます。
レナートさん、お祝いのお言葉ありがとうございます。
この場をお借りして改めて、MetaQuotes Software Corp.の ウェブサイトにMQL4チュートリアルを掲載できたことを大変光栄に思っています。皆様の信頼とご支援、ご鞭撻に心より感謝申し上げます。また、本書の作成にあたり、MetaQuotes Software Corp.のStanislav Starikov氏とRashid Umarov氏には貴重なアドバイスとご協力をいただいた。
この記事では、1つの同じArrayMinimum()の呼び出しで、4種類の配列の初期化を示しています。
配列のサイズ [] を指定せずにサブプログラムで配列を初期化すると、「RunTime」エラーが発生することが示されている
- 最初の2つのバリエーションでは、エラーが引用され、翻訳では、"配列の先頭の不正なADDRESS "となります。
-2番目の2つのバリエーションが動作しており、次元数を[1000]に指定すると自動的に静的配列になることが示されています。
結論
1) MQL4の配列は常に静的とは限りません。
2) 静的な a[] の定義、すなわち次元を明示しない定義は動作しませんが、エラーメッセージは出ません。Expert Advisorウィンドウの2回目以降のティックで、実行時にエラーが表示されます。
3) 静的/動的エラーは、配列がサブ/ファンクで定義されている場合に表示され、エキスパートアドバイザ画面を見た人だけがキャッチできるようにしました。
で、2回目のダニが来たときだけ。例えば、ストラテジーテスターを使用せず、週末にインジケーターのデバッグを行った場合、エラーは検出されません。
4) 教科書の一節「MQL4の配列は常に静的です」は、以前のビルドと関係があるのかもしれません。
テキストチュートリアルに加えて、ビデオチュートリアルのセットも欲しいです。ビデオチュートリアルのセットを用意する。特に欠けているのは、プログラムをダウンロードし、インストールし、最初の買いまたは貝の取引を行う方法という、非常に最初のレッスンです。
からSK
この記事では、1つの同じArrayMinimum()の呼び出しで、4つのバージョンの配列の初期化を示しています。
配列のサイズ [] を指定せずにサブプログラムで配列を初期化すると、「RunTime」エラーが発生することが示されている
- 最初の2つのバリエーションでは、エラーが引用され、翻訳では、"配列の先頭の不正なADDRESS "となります。
-2番目の2つのバリエーションが動作しており、次元数を[1000]に指定すると自動的に静的配列になることが示されています。
結論
1) MQL4の配列は常に静的とは限りません。
2) 静的な a[] の定義、すなわち次元を明示しない定義は動作しませんが、エラーメッセージは出ません。Expert Advisorウィンドウの2回目以降のティックで、実行時にエラーが表示されます。
3) 静的/動的エラーは、サブ/ファンで配列が定義されている場合に表示され、Expert Advisorsウィンドウを見た人にのみ表示されます。
で、2回目のダニが来たときだけ。例えば、ストラテジーテスターを使用せず、週末にインジケーターのデバッグを行った場合、エラーは検出されません。
4) 教科書の一節「MQL4の配列は常に静的です」は、以前のビルドと関係があるのかもしれません。
理由があまり明確でないですね。無次元配列を宣言し(実際には、プログラムには配列の名前しかなく、その要素は定義されておらず、メモリも確保されていない)、ArrayMinimum()関数を使って、存在しない要素の中から最小値を見つけようとするのです。もちろん、配列のstatic宣言の有無にかかわらずエラーは発生しますので、実行エラーは配列のプロパティがstaticであるか否かを示すものとして扱う必要があります。
MQL4の配列は定義上、静的です。これは(もちろん,配列に少なくとも1つの要素があれば別ですが),配列の識別子の前にstaticキーワードがあるかどうかにかかわらず,(配列を宣言した)関数が最後に終了してから次に呼ばれるまで,配列の要素が保存されることを意味します.
どうでもいいけど、こういうメモリ割り当てのトリックは昔から使ってるんだよね。
配列の内容ではなく、そのアドレスについて、コンパイルエラーも リンクエラーもADDRESSのランダムエラーもないことを書きました。
つまり、サブルーチンの中で配列[]を定義して、後でそれを大きくすることをコンパイラが許可してくれたのです。 - それは良いことです(!)。
配列による動的メモリ割り当てです。
しかし、この配列へのポインタはすべて直接ポインタとしてリンクされる(ポインタへのポインタはリンクされない)ため、
、その後の動的メモリ割り当て時にリンクされた静的アドレスと新たに割り当てられた配列アドレスの間にミスマッチが発生することになります。
すなわち、MQL4での配列(ポインタ)参照は静的なものになり、本当に静的な配列である場合にのみ正しく動作するようになったのです。
コンパイラは、サブルーチン内部で明示的にサイズを指定しないと、将来的に配列が移動されることを理解できないのです。
プログラマはstaticを指定して、すべてが正しいと思っていますが、明示的にサイズを指定しなければ、static配列にはならず、実際には動的な配列になります(コンパイルや読み込みのエラーはありません)。
この問題はそれほど大きくはなく、通常、誰もがグローバルレベルでアレイを保持しています。
しかし、チュートリアルでは、すべての配列はすでに静的であるはずだ、ではなく、ローカルな配列はサイズを明示的に指定して静的に書きなさい、と書くことが望ましいです。
からSK
プログラマはstaticを指定して、すべてが正しいと思っていますが、もし明示的にサイズを指定しなければ、static配列にはならず、実際には動的な配列になります(コンパイルやロードのエラーはありません)。
MQL4の配列がすべてstaticであることを知っているプログラマは、staticを置かないでしょう。
おそらく、概念を混同しているのでしょう。この場合の "static "とは、宣言された関数の実行間隔において、配列要素の値を保存する性質を意味する。配列は、名前の前に static が付いていても、この間は常に値を保持します(ただし、ローカル変数には当てはまらず、明示的に static と宣言する必要があります)。
しかし、ArrayResize()を使えば、1次元の配列のサイズを変更することは可能です。