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

 
Nikolai Semko:

ありがとうございました。しかし、そこには私の疑問に対する答えはありませんでした。
A *a= new A のとき、なぜデストラクタが呼ばれないのか理解できない。

https://www.mql5.com/ru/docs/basis/variables/object_live

pointer_object=newClass_name式で生成されたオブジェクトはその後 delete(pointer_object) 演算子ですべて破棄しなければ ならない。何らかの理由でこの変数が削除オペレータによって 破壊されなかった場合、それに関するメッセージが「Experts」ジャーナルに表示されます。複数の変数を宣言し、それらをすべて同じオブジェクトポインタに代入することが可能です。

Документация по MQL5: Основы языка / Переменные / Создание и уничтожение объектов
Документация по MQL5: Основы языка / Переменные / Создание и уничтожение объектов
  • www.mql5.com
После загрузки на исполнение mql5-программы каждой переменной выделяется память в соответствие с типом переменной. Переменные делятся на два типа по уровню доступа - глобальные переменные и локальные переменные, и по классам памяти: входные параметры mql5-программы, статические и автоматические. Каждая переменная при необходимости...
 

MQLにOnTimer()関数の チェックを依頼します。

MT4のStrategy Testerではなぜか動かない(エラーは出ないが、この関数内は何も実行されない)、オンラインでは問題ない。

MT5では、テスターとオンラインの両方で機能します。

ありがとうございました。

 
インコレクトイットで多くの時間が費やされる
Core 1  pass 114 tested with error "incorrect input parameters" in 0:00:00.218

OnInitでは2つの数値だけが比較され、フルパスよりもインコレクトパスの方が時間がかかるのですどうして?


このExpert Advisorを完全最適化で動かしてみましょう。

input int Range = 0; // задать Оптимизацию 1 .. 10000

int OnInit() { return(INIT_PARAMETERS_INCORRECT); }


8つのAgentで作業した結果を得ることができる

Tester  optimization finished, total passes 10000
Statistics      optimization done in 2 minutes 24 seconds


Expert Advisorはこちらです。

input int Range = 0; // задать Оптимизацию 1 .. 10000

void OnInit() {}
Tester  optimization finished, total passes 10000
Statistics      optimization done in 0 minutes 31 seconds


最後に、このような

input int Range = 0; // задать Оптимизацию 1 .. 10000

void OnInit() { ExpertRemove(); }
Tester  optimization finished, total passes 10000
Statistics      optimization done in 2 minutes 19 seconds


2系統の出力

  1. Incorrect-InitとExpertRemoveは、速度的には同じです。
  2. 空走はOnInitからの終了に比べ、〜5倍高速です。


2点目については、明らかに何らかのミスがある。OnInitから飛び出すよりも、空走を行った方が時間的にメリットがあります。Incorrect-InitとExpertRemoveの利点がほとんどなくなってしまうので、修正をお願いします。

 

EA/指標/スクリプトやアカウントを含むお気に入りタブ は、ターミナルを終了した後にのみ記憶されます。このため、異常終了(電源断)すると、このタブはリセットされます。変更する際に保存することは可能でしょうか?

お気に入りにフォルダを追加できたらとても便利だということが、明確に理解されることもあります。

 
A100:
では、こんな風にやってみてください。

結果

1:pointer_automatic
1:ポインターダイナミック
2:ポインターダイナミック
2:ポインターオートマチック

ありがとうございました。かなりの解答です。

でも、コンパイラは悪態をつかないほうがいいかもしれませんね。

class B  { public:
                     B(void *b) {d=b;}
                    ~B() { delete d; }
   void             *d; };

これはバグなのか何なのか?
newで クラスのインスタンスを生成しても、デストラクタを呼び出すことはない。

デストラクタを呼び出すための特別なクラスを作るしか解決策はないのでしょうか?それとも、なくても大丈夫なのか?

 
Andrey Barinov:

newで 作成、deleteで 削除

問題は、デストラクタにdeleteを 入れることですが、new (A *a=newA ;) でクラスのインスタンスを生成しても、デストラクタは呼び出されないのです。

 
aleger:

どのジグザグ・インディケータでも、価格の極値である高値と安値を導き出すことは可能ですか、また可能であればどのように導き出すのですか?

その安定した結合と、形成されたトップとボトムへの近接性を確保すること。

OBJ_TEXT の例を参照してください。

 

ありがとうございます。
まさにここに書いてある通りです。

Все объекты, созданные выражением указатель_объекта=new Имя_Класса, обязательно должны быть впоследствии уничтожены оператором delete(указатель_объекта). 
Если по каким то причинам такая переменная по окончании работы программы не была уничтожена оператором delete, то об этом будет выведено сообщение в журнал "Эксперты". 
Можно объявить несколько переменных и всем им присвоить указатель одного объекта.
Если динамически создаваемый объект имеет конструктор, то этот конструктор будет вызван в момент выполнения оператора new. Если объект имеет деструктор, 
то деструктор будет вызван в момент выполнения оператора delete.

つまり、バグではなく、結果的に悪循環に陥る機能なのです。
動的オブジェクトの削除処理を自動化したい場合、デストラクタが呼ばれるのはdeleteの 時だけなので、デストラクタ自体にdeleteを入れても 意味がない。
しかし、@A100がここで 提案したように、自動化は別のクラスの別のインスタンスを通して実装することができる。

 
aleger:

ご指摘ありがとうございます。もう、読んでは試し、読んでは試しで、疲れました。ZigZagの実用例を見たいのですが・・・。

私のアバターのようにジグザグに、しかし、下の極値の結合はOKなので、上の極値の結合をRIGHTにします

k=(WindowPriceMax()-WindowPriceMin())/30で縛る方法は、ウィンドウサイズが大きく変化するとうまくいかないので、何か別の方法を希望します...。


OBJ_TEXTの 例では、上と下の両方がバインドされています。リンクをたどって、サンプルを実行する ...

 
Nikolai Semko:

つまり、バグではなく、機能として、結果的に悪循環に陥ってしまうのです。

割り当てられた管理不能なリソースの制御を解決する方法は、スマートポインタを使用することであることは、すでに以前から言われていることです。C++との完全な相似形。
おそらく問題は、解決策が銀の皿の上に提示されなかったことでしょう、すみません。


サイト内検索で "shared_ptr "と入力すれば、最初の結果が表示されるので、ぜひ試してみてください。