エラー、バグ、質問 - ページ 786

 

あるインジケータの .ex5 が、以前のビルドでコンパイルされた .ex5 と比べて、サイズが 10 倍近く大きくなっています。まあ、問題ないでしょう。しかし、インジケータの描画時(パラメータを入力する前)にエラーが発生しました。

2012.07.27 02:53:57     MP2012_GRI (EURUSD,M30) Access violation read to 0x000000003FF39D25

すでに3桁のコードを修正しました。また、ちょっとコメントアウトすると、(上記のエラーと合わせて)出るんです。

2012.07.27 02:56:42     Custom Indicator        'MP2012_GRI' may work incorrectly, as it requires more than 256Kb of stack memory
とか言って本当に効かない

また、コードを少しコメントアウトすると、最初の2つのエラーは消えますが、インジケータをアンロードする ときにエラーが発生します。

2012.07.27 02:47:35     MP2012_GRI (EURUSD,M30) 9 leaked strings left
(数値は異なるかもしれません。コメントアウトしたコードの量に依存します)

事前に調べていたのですが、私の機能は容量が大きすぎるようで、小さい機能で勝負することになりました。

...そして、前回のビルドではすべてがうまくいっていました。

 
notused:

あるインジケータの .ex5 が、以前のビルドでコンパイルされた .ex5 と比べて、サイズが 10 倍近く大きくなっています。まあ、問題ないでしょう。しかし、インジケータの描画時(パラメータを入力する前)にエラーが発生しました。

すでに3桁のコードを修正しました。で、もうちょっと変えると、(上のエラーと合わせて)こうなります。

セキュリティ向上のため、サンドボックス環境の制御を強化しました。

スタックに関するメッセージは、ある関数で256キロバイト以上のスタックを使用したことを伝えるもので、これはプログラミングにおける深刻な問題です。例えば、C/C++では16Kbでもローカルスタック関数を使用すると重大な警告とみなされる。

関数などで静的配列を多く確保しているのではないでしょうか。

void func(void)
  {
   double arr1[128000];
   double arr2[128000];
   double arr3[128000];

  }

そんなことはしてはいけない。

大きな配列が必要な場合は、ダイナミックアレイを 上手に使ってください。例えば、こんな感じです。

double ExtArr[];

void func(void)
  {
   double arr1[];
   double arr2[];

   ArrayResize(ExtArr,128000,0);
   ArrayResize(arr1,128000,0);
   ArrayResize(arr2,128000,0);
  }
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
Renat:

セキュリティ強化のため、サンドボックス環境の制御を強化しました。

スタックに関するメッセージは、スタックの1つの関数で256キロバイト以上使用したことを伝えるもので、プログラミングでは深刻な問題である。例えば、C/C++では、関数内で16kbでもローカルスタックを使用すると重大な警告とみなされる。

関数などで静的配列を多く確保しているのではないでしょうか。

それはやめたほうがいい。

大きな配列が必要な場合は、代わりに動的配列を 使用します。例えば、こんな感じです。

このインジケータではスタティックな配列は全く使っていませんし、関数などでもintより重いものは渡していません。でも、いろいろなグラフ機能を積極的に使うんですね。

例えば、こんな感じです。

   ObjectSetString(0, stmp, OBJPROP_TEXT, "HB");
   ObjectSetInteger(0, stmp, OBJPROP_COLOR, hbColor);

最後の行がコメントアウトされていれば、すべて問題ありません。問題は、このような電話がたくさんあることで、この電話

ObjectSetInteger(0, stmp, OBJPROP_COLOR, hbColor);

は、20番目か30番目の連続です。

コードのほとんどがObjectSetXXXで構成されているのに、コメントすることで問題を回避しているので、問題は関数の大きさにあるのだと思います。実験してわかったのですが、細かく分割しても意味がないんです。積極的にインライナーを使っても、全部積み上げてしまってエラーが発生します。もっとコードを出してみてもいいのですが、明日にします。サービスデスクも、早く解決しないと明日になってしまいます。

 
notused:

このインジケータでは静的配列は全く使っていません。intより重いものは関数などに渡していません。しかし、あらゆる種類のグラフ機能が活発に使われている。

でも、何か大きなものがあるんですよね。

例えば、メンバーに大量の静的配列を持つだけのクラスのローカルコピーをインクルードします。そこにはたいてい、ローカルスタックコンシューマーの預金が隠れている。


例えば、こんな感じです。

最後の行がコメントアウトされていれば、すべて問題ありません。問題は、そのような電話がたくさんあることと、この電話

は、20番目か30番目の連続です。

コードをコメントすることで問題が回避され、コードのほとんどがObjectSetXXXで構成されているので、問題は関数のサイズにあると思います。実験してわかったのですが、細かく分割しても意味がないんです。積極的にインライナーを使っても、全部積み上げてしまってエラーが発生します。もっとコードを出してみてもいいのですが、明日にします。サービスデスクも明日、それまでに解決しなければ。

機能を分割し、クラス分けして積み上げる。

Inlinerは、あまり大きなコード片を挿入しないので、おそらく関係ないでしょう。特に、重い/ローカル変数 が多い場合。

 
Renat:

でも、何か大きなものがあるんですよね。

例えば、メンバーに大量の静的配列を持つだけのクラスのローカルコピーをインクルードします。そこにはたいてい、ローカルスタックの消費者の預金が隠れている。


機能を分割し、クラス分けして積み上げる。

Inlinerは、あまり大きなコードの塊を挿入しないので、おそらく関係ないのでしょう。特に、重い/多くのローカル変数 を持っている場合。

サービスデスク #444495
 

なぜこのようなことになるのでしょうか、それともずさんな支払いなのでしょうか? 1日に1人のエージェントが1KRを稼ぎ、0.3KRが支払いを行いました。


 

servicedeskへの 書き込みは、必ずこれらのヘッダを付けて行ってください。

端末のバージョンとビットレート

...

問題の内容

...

動作シーケンス ...

...

得られた結果 ...

...

期待される結果 ...

...

追加情報 ...

...

それとも、自分の言葉で表現できますか?

 
Zeleniy:

それとも、自分の言葉で表現できますか?

リストがあればもっといい。そうすれば、バグに対処する人はとても楽になるはずです。
 
Zeleniy:

これらの見出しでservicedeskに 書き込む必要があるのでしょうか?


とか、自分の言葉でできるのか?

をすることは可能ですが

端末のバージョンとビットレート
問題の説明

操作手順
得られた結果
期待される結果

必ず

------------

あなたは自由なテーマでエッセイを書いているのではなく、開発者のために文章を書いているのです。

 
sergeev:

は全部自分でできるけど

端末のバージョンとビットレート
問題の説明

操作手順
得られた結果
期待される結果

必ず

------------

あなたは自由なテーマでエッセイを書いているのではなく、開発者のために文章を書いているのです。

Site mql5.comと 提案の セクションを選んだのですが、見出しへの付け方がよくわかりません。