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

 
uncleVic:
この件もCDに書いてください。レビューにあるものがすべてテスターで選べるわけではない」みたいな。
いや、引き下がらない。アルパリとMKの2つのターミナルを開いていて、行ったり来たりしているのですが、後者ではマーケット概要にEURGBPを追加するのを忘れていました。
 
marketeer:
いや、リバウンドだ。アルパリとMKの2つのターミナルを開いていて、行ったり来たりしているのですが、後者ではマーケット概要にEURGBPを追加するのを忘れていました。
そうなるんです。
 

スクリプトの中で、インジケータの系列のように動作する配列を作成しようとしています。すなわち、新しいエントリーが現れると、配列全体を後ろにずらし、新しいエントリーをNULL位置にする。

void OnStart()
  {
   int a[];
   int size=5;               // размер массива
   bool flag=true;           // флаг направления индексации
   ArraySetAsSeries(a,flag);  // зададим направление индексации
   ArrayResize(a,size);      // зададим размер массива
//---
   for(int i=0;i<size;i++)  // задаём значения и распечатываем массив
      a[i]=size-i;         // 54321
   Print("[",a[0],"][",a[1],"][",a[2],"][",a[3],"][",a[4],"]");
//---
   ArrayResize(a,size-1);     // уменьшаем размер 5432
   ArraySetAsSeries(a,!flag);  // меняем направление индексации 2345
   ArrayResize(a,size);       // возвращаем в исходный размер  2345х
   ArraySetAsSeries(a,flag);   // возвращаем в исходную индексацию х5432   
   a[0]=6;                   // задаём "пустому" нулевому данному значение
//---
   Print("[",a[0],"][",a[1],"][",a[2],"][",a[3],"][",a[4],"]");
   // в результате получаем 64321 вместо нужного 65432
  }

よく言われるように、なぜ?

もしかしたら間違って いたかもしれませんが、真っ先に思いつくのは、これも言語最適化のバグです。

HZZY あと、ループを使ってデータを移動させたいと考えている方にもお願いなんですが、5...100...1000...という配列の場合はうまくいくんですが、それ以上の配列の 場合はうまくいかないんですね。

 
Urain:

スクリプトの中で、インジケータの系列のように動作する配列を作成しようとしています。すなわち、新しいエントリーが現れると、配列全体を後ろにずらし、新しいエントリーをNULL位置にする。

なぜかと言われれば、それは


CArrayIntという クラスを使って、insertでデータを突っ込んでみたらどうでしょう?
 
uncleVic:
また、CArrayInt クラスを使用して、そこにデータを挿入すると?

配列自体はクラスでプライベートなまま、パラメータで配列を渡せるようにしたい。

繰り返しになりますが、私の記憶では、この方法はループ内のデータをシフトさせることに従事しており、かなり遅いです。

 
Urain:

スクリプトの中で、インジケータの系列のように動作する配列を作成しようとしています。すなわち、新しいエントリーが現れると、配列全体を後ろにずらし、新しいエントリーをNULL位置にする。

よく言われるように、なぜ?

もしかしたら間違って いたかもしれませんが、真っ先に思いつくのは、これも言語最適化のバグです。

HZZY あと、ループを使ってデータを移動させたいと考えている方にもお願いなんですが、5...100...1000...という配列の場合はうまくいくんですが、それ以上の配列の場合はうまくいかないんですね。


ZZZY "について:リサイズでメモリが擦り切れたりしませんか?
 
uncleVic:
ZZI」については、リサイズでメモリが断片化されないのですね。

mql5で他に(メモリを確保する)関数を知りません。

HH そして、私が理解した限りでは、配列の方向も純粋に仮想的なものだと思います。

ZZY どうやらメモリではなく、アドレス空間の仮想化に取り組まなければならないようです。また、これでは作業も遅くなってしまいます。やはり直接アクセスの方が早いですね。

 
Urain:

配列自体はクラスでプライベートなまま、パラメータで配列を渡せるようにしたい。

繰り返しになりますが、私の記憶では、この方法はループの中でデータをシフトさせるだけで、かなり遅いです。

配列クラスの改良を考えないといけないですね(私にとっては)。
 
uncleVic:
配列クラスの改良を考えなければならないだろう(自分にとって)。

そうですね、ゼロポジションでのバーチャルインサートはいいかもしれません。しかし、本当にデータを動かすわけではなく、そうでなければ長くて非効率的です。

とにかくメモリを直接扱えないのが悪い、仮想化アクセラレーションが充実している、C++の速度だって配列ではなくセルアドレスにすれば1.5倍は速くなる。

 
Urain:

スクリプトの中で、インジケータの系列のように動作する配列を作成しようとしています。つまり、新しいエントリーが現れると、配列全体が後ろにシフトされ、新しいエントリーはゼロの位置に作られる。

ZZZY私は心配しないように周期でデータを移動するように助言したい同志を求め、このオプションは、5の配列のためにうまく動作...100...1000...が、大きなサイズの配列では受け入れられません。


しかし、アレイ全体を移動させるのはやめたほうがいいのでは?:)

動的配列で,新しいデータは末尾に書き込まれ,サイズは変更/記憶され,AsSeriesフラグはインデクシングのみを変更する.

通常のオーダーでは配列のN要素、シリアルではSize-N-1となります。

Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
理由: