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

削除済み  
Interesting:

動的なオブジェクトを作らない - 今とこれらのオブジェクトに関連するすべてのものを使用する必要はありません(しかし、その後、あなたは多くのことを行うことができなくなります)。

今の意味ではなく、ダイナミックなオブジェクトを扱う意味を理解したい...。

void OnStart()
{
//---
プライマーオベクト
obekt.f1()。
}
//+------------------------------------------------------------------+
クラス・プライマー
{
を公開します。
void f1();

primer()です。
};

primer::primer()
{
Alert("こちらも初期化は作成時のみだと思います");
};

プライマー::f1()
{
int l[];
ArrayResize(l,3)です。
l[0]=87;
l[1]=67;
l[2]=57;
ArrayResize(l,5)です。
l[3]=47;
l[4]=37;
Alert(l[0]," ",l[1]," ",l[2]," ",l[3]," ",l[4])となります。
};

このコードではエラーは発生せず、配列は動的です。なぜ?

そして、それを破壊したいのであれば

{

オベクト
obekt.f1()。


}

C++をパクってアドレス処理をメチャクチャにしてMQLに入れたようです

削除済み  

220Volt:

以下は、私のテキストです(引用から抜け出せない) :)

このコードではエラーは発生せず、配列は動的です。なぜ?

1.なぜ、エラーで実行されるのですか?

a) オブジェクトが自動的に生成され(OnStartでオブジェクトのインスタンスを宣言する方法が原因)、自動的に削除される。

primer  obekt1;   //Конструктор будет вызван автоматически уже на этой строчке
 primer *obekt2; //Указатель на динамический объект

void OnStart()
{
obekt2 = new primer; //Конструктор выполняется вот тут 

obekt.f1();

delete(obekt2); //Тут выполняется деструктор (отсутствие delete приведет к утечки памяти в момент завершения работы скрипта)
}

オブジェクトについては、そのインスタンスを自動的または動的に生成することができます。最初のケースでは、コンストラクタは通常、初期化中に実行され、2番目のケースでは、new 演算子が使用された後に実行されます。

b) 論理的には、f1()でもエラーは出ないはずです(個人的には別の実装をしていたかもしれませんが)。

ダイナミックアレイについては静的配列と異なる点は、このような配列は次元が不明であることです。つまり、このような配列を扱う前に、ArrayResize を使って指定する必要があります(配列の最初の次元に 新しいサイズを指定する必要があります)。ここで重要なことは,配列の要素には0から番号が振られていることです.

2.もしあなたがダイナミックオブジェクトを扱うことに興味があるなら、この例 -Tetris(旧フォーラムではまだ何をするのか理解できませんが)を注意深く研究してみてください...。

削除済み  

お邪魔してすみません、どうしても真相を知りたいんです。何を勘違いしているのか、教えてあげよう。

C++の表記を見ると(プライマークラスが宣言されている)。

primer *ukazatel=new primer;

は、ukazatelは、我々のオブジェクトであるプライマークラスのコピーが格納されているメモリ上のアドレスを含んでいると言っています。MQLからアドレスが削除され、ukazatelにはオブジェクトディスクリプタが含まれています。そこから何を得るか?ただ一つ違うのは、ブロックの中で新しいオブジェクトを宣言し、ブロックを終える前にdeleteを使い忘れた場合、そのオブジェクトはプログラムが終了したときにだけ削除されることです。また、ブロックを抜けると、このオブジェクトとのハンドルによる接続は失われる。

newで宣言すれば、そのオブジェクトのメモリは動的に確保され(つまり、サイズを大きくできる)、newがなければ、そのオブジェクトは静的変数しか 持てないという考えを持っていたのです。しかし、私の仮定は確認されませんでした(先に投稿したスクリプトでは、オブジェクトはnewを通じてではなく、動的変数を扱って宣言されています)。

そして、これらの情熱の末、私はあまり良くない状況に陥っています。newがあるのとないのとでは何が違うのか理解できませんし、コンパイラ自身がそこの何かを修正するのであれば、なぜ私は悩む必要があるのでしょうか?

Документация по MQL5: Основы языка / Переменные / Статические переменные
Документация по MQL5: Основы языка / Переменные / Статические переменные
  • www.mql5.com
Основы языка / Переменные / Статические переменные - Документация по MQL5
削除済み  

ドキュメントに書かれているようなこともやってみた(新しいことを見つけるために).

スイッチ(5)

{

ケース 5.m_shape=new CTetrisShape1; // このオプションは全く機能しません(これはドキュメントからです!!! )。!!!)この方法のみ

( m_shape=new CTetrisShape1; )

}

というエラーが表示され、m_shape.___オブジェクトにアクセスできなくなります。

削除済み  

220Volt:

そして今、私はこれらの情熱の後にあまり良くない状況にいることに気づきました。それが新しいかそうでないかの違いは何なのか理解できませんし、もしコンパイラがそこの何かを修正するなら、なぜ私は全く気にする必要がないのでしょうか?

オブジェクトのインスタンスは、new if演算子を使って動的に生成されます(これが、私がテトリスの例を見てほしいと頼んだ理由です)。

1.オブジェクトのインスタンス数は事前にわからない(ただし、必ず複数存在することが想定される)。

2.もし、同じ祖先を持つ「異種」オブジェクトへのポインタの配列を作りたい場合。

3. オブジェクト(というよりこのオブジェクトへのポインタ)がプロシージャや関数のパラメータとして使用されることが想定される場合(おそらくライブラリに渡す必要があります)。

4.プログラムの異なる部分で1つのオブジェクト(このオブジェクトへのポインタと読む)を使って作業することを意図している場合。例えば、同じオブジェクト「注文」が、Expert Advisorが作成した注文の配列、特定のシンボルに対する注文の配列、特定のポジションを形成した注文の配列、などに入っていることがあります。

5.このほかにも、動的に作成される誓約書やポインターを適用することで解決するタスクはたくさんあります。

削除済み  
220Volt:

ドキュメントに書かれているようなこともやってみた(新しいことを見つけるために).


というエラーが発生し、m_shape.___オブジェクトにアクセスできなくなります。

実際、テトリスの例では、次のように実装されています(あなたの場合、break演算 子がないことに注意してください)。

   switch(nshape)
     {
      case 0: m_shape=new CTetrisShape1; break;
      case 1: m_shape=new CTetrisShape2; break;
      case 2: m_shape=new CTetrisShape3; break;
      case 3: m_shape=new CTetrisShape4; break;
      case 4: m_shape=new CTetrisShape5; break;
      case 5: m_shape=new CTetrisShape6; break;
      case 6: m_shape=new CTetrisShape7; break;
     }

ポインタがNULLかどうかのチェックをお忘れなく

 if(m_shape!=NULL)
 {
//С указателем можно работать
 }
削除済み  

興味深い......ありがとうございました
削除済み  

デベロッパー

ドキュメントでは、テスターで動作しないもの、あるいは特定の機能で動作するものをすべて「明示的に」指定してください(不要な質問が出ないように)。

例えば、ローカルタイムと GMTタイム(サーバータイムと同一視)の特殊性や、TimeGMTOffsetの問題点を明示しないと、期待した結果は得られない。

 

誰が知っているのだろう -- Unicodeの文字の配列を文字列に変換する普通の方法があるのだろうか?

削除済み  
TheXpert:

誰が知っているのだろう -- Unicodeの文字の配列を文字列に変換する普通の方法があるのだろうか?

配列の各要素を 個別に翻訳する必要がありそうですね。
Документация по MQL5: Основы языка / Переменные
Документация по MQL5: Основы языка / Переменные
  • www.mql5.com
Основы языка / Переменные - Документация по MQL5