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

 

変数配列のサイズを 決定するために必要だが、エラーが出る。

void OnStart()
  {
   int j=1000;
//---
   double arrBalancesTS[][j];
  }

//---

//---

定数(#define)や数値で直接動作しますが、このようなことはありません。なぜ?

 
tol64:

変数配列のサイズを決定するために必要だが、エラーが出る。

//---

//---

定数(#define)や数値で直接動作しますが、このようなことはありません。なぜ?

定数の場合は静的な配列、変数の場合は動的な配列となります。また、動的なものの大きさは、ArrayResize
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 

tol64:

なぜ?

2次元目以降のサイズは固定です。定数で設定するしかない。
 
tol64:

定数(#define)や数値の場合は、直接動作しますが、このようなことはありません。なぜ?

なぜなら、#defineで 定義すると、コンパイラはコンパイル前に 遭遇したマクロを正しいエントリに置き換えるだけだからです。したがって、それは見ている

void OnStart()
  {
//---
   double arrBalancesTS[][1000];
  }

MQL5言語と矛盾しないようにすること。

 
Yedelkin:

OKです。それなら度胸がつく。そこで、Print() 関数の説明には、 double型の データは、小数点以下16 桁の精度で出力する」と書かれています。実は、Print()関数は、やや丸みを帯びたデータを出力 することが判明しています。

ND 0 victorg2 (EURUSD,M1) 11:04:42 Print(b)=200.0
MP 0 victorg2 (EURUSD,M1) 11:04:42 Print(DoubleToString(b,16))=199.999999999999716

ポイントは、実数は 有効数字17桁以下でメモリに保存されることです。

この例で違いを感じてみてください。

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   double a,b;

   a=7.0/200.0;
   b=7.0/a;
   Print("Print(b)=",b);
   Print("Print(DoubleToString(b,16))=",DoubleToString(b,16));

   Print("Print(StringFormat(b,%.15G))=",StringFormat("%.15G",b));
   Print("Print(StringFormat(b,%.16G))=",StringFormat("%.16G",b));
   Print("Print(StringFormat(b,%.17G))=",StringFormat("%.17G",b));
   Print("Print(StringFormat(b,%.18G))=",StringFormat("%.18G",b));
   
//19999999999999997
   Print("Print(StringFormat(b,%.15f))=",StringFormat("%.15f",b));
   Print("Print(StringFormat(b,%.16f))=",StringFormat("%.16f",b));
   Print("Print(StringFormat(b,%.17f))=",StringFormat("%.17f",b));
   
  }
//+------------------------------------------------------------------+
ヘルプの記述も修正される予定です。
 
notused:
定数の場合は静的な配列、変数の場合は動的な配列となります。また、動的なもののサイズは ArrayResize を用いて決定される。
TheXpert です。
2次元目以降のサイズは固定です。定数で設定するしかない。
ロッシュ

なぜなら、#defineで 定義すると、コンパイラはコンパイル前に 遭遇したマクロを正しいエントリに置き換えるだけだからです。したがって、それは見ている

MQL5言語と矛盾しないようにすること。

ありがとうございます。1次元と2次元の配列のサイズが計算で定義され、定数にはできない場合、どうすればよいか教えてください。ArrayResize()では、結局のところ、最初の次元だけサイズを変更することができます。また、初期状態では設定できないのに、なぜ変数値を適用することで配列のサイズを変更できるのでしょうか?
 
tol64:
ありがとうございます。1次元、2次元ともに配列のサイズが計算で決まり、定数にできない場合、どうすればよいか教えてください。ArrayResize()では、1次元目のサイズのみ変更可能です。また、初期状態では設定できないのに、なぜ変数を使って配列のサイズを変更できるのでしょうか?
クラスをご利用ください。
 
tol64:
ありがとうございます。1次元、2次元ともに配列のサイズが計算で決まり、定数にできない場合、どうすればよいか教えてください。ArrayResize()では、1次元目のサイズのみ変更可能です。また、初期状態では設定できないのに、なぜ変数値を適用することで配列のサイズを変更できるのでしょうか?
CMatrixクラスの例については、オーバーロード操作の セクションを参照してください。
 
こんにちは。

2つのクラスでメッセージを交換させる方法がわかりません。

AクラスにはBへのリンクを、BクラスにはAへのリンクを持たせたい。
コンパイルエラーが出たのですが、もしかしたらMQL5ではそれができないのかもしれません。しかし、それがなければ、オブジェクト・プログラミングは30%しか使われない。

解決策としては、すべてを知り尽くした大きなGODクラスを1つ書けばいいのかもしれません。しかし、これではあまりエレガントとは言えませんね。
解決に協力してくれそうな人は?

ありがとうございました。
 
クラスについては、前方宣言を 参照してください。