MQL5におけるOOPに関する質問 - ページ 91

 
Dmitry Fedoseev:

なぜ、いきなりうまくいかないのでしょうか?3つの列挙、いずれも10以上ではない 中学2年生の算数。

3つの列挙と2つのintで、4バイト=intが必要です。

int +1000 - -1000 の範囲で必要です。+1000 , pips, それはちょうど2^10です。

int intは検討する価値がある、1pipsのステップは重要ではない、2.5-...9pipsも可能、すなわち離散性はあまり重要ではない

 
Igor Makanu:

3つの列挙と2つのint、4バイトが必要

int +1000 - -1000 の範囲で必要です。+1000 , pips, それはちょうど2^10です。

intはまだ検討する価値がある、1pip単位は重要ではない、2.5-...9pipを持つことができる、すなわち離散性はそれほど重要でない

十分すぎるほどのスペースがあります。int_max=2147483647 です。

ストレートにぶっきらぼうにするのではなく、テンスにして、8*8*4で惜しみなく作ればいいんです。考えるのは自分だけでいい)))でも、その必要はなく、とにかくすべてがフィットする。

そして、チェックするために、INT_MAXまでのサイクルを開始するのはいかがでしょうか。

 
Dmitry Fedoseev:

十分すぎるほどの広さ。int_max=2147483647 です。

また、ピンチのときに行うために、占有して、経済的に、 - 8 * 8 * 4を愚かにも、ストレートすることはできません。考えるのは自分だけでいい)))でも、その必要はなく、とにかくすべてがフィットする。

そして、チェックするために、INT_MAXまでのサイクルを作るのはどうでしょうか。これはハードウェアによってチェックされるので、自分で結果ファイルを見る必要はありません。

気にしない...評価するためのコードが必要であり、変換方法よりも方法論が重要である

 
Igor Makanu:

気にしない...評価するためのコードが必要であり、テスト方法は変換方法よりも重要である

ビット単位のプライム化、ダメですか?ビット値で数値を文字列に変換するようなものです。一つは整数用、もう一つはドットとチェック用です。それはあくまでもデバッグのためです。

 
Alexandr Andreev:

ビットワイズ・アンライト、ダメ?ビット値で数値を列挙するようなもの。一つは整数用、もう一つはドットとチェック用です。それはあくまでもデバッグのためです。

うん、それはわかるけど、どうやって検証を自動化するんだ?

問題は、私の例ではなく、まだ他のデータの3つのintをパックする必要があるという事実で、私はそれぞれのパックをチェックするのにあまり時間を費やしたくない。


ZS: アイデアは素晴らしいのですが、ビット単位の値ではなく、16進数の値です。

 
Igor Makanu:

はい、すべてクリアです。しかし、チェックを自動化するにはどうしたらいいのでしょうか?

問題は、私の例ではなく、まだ他のデータの3つのintをパックする必要があるという事実で、私はそれぞれのパックをチェックするために多くの時間を費やすことはしたくありません


HH: いい考えですが、ビット単位の値ではなく、16進数です。printf() というか、stringformat() から取得できます。

)) 何が必要なのかがわからない

   v = (V)(data & 0x3);
   d = (D)((data >> 2) & 0x7);
   t = (T)((data >> 5) & 0x7);
   uint tmp = ((data >> 8) & 0xFFF);
   param2 = (tmp & 0x800) == 0x800 ? -(int)(tmp & 0x7FF) : (int)(tmp & 0x7FF);
   tmp = data >> 20;
   param1 = (tmp & 0x800) == 0x800 ? -(int)(tmp & 0x7FF) : (int)(tmp & 0x7FF);

オフセットを自動化するのか、何なのか?

このチェックは何ですか?

そして、いつでもソースと変換後の値を確認すればいいのです。

 
Igor Makanu:

気にしない...評価するためのコードが必要であり、変換方法よりも検証の方法論が重要である

変換方法が明確で理解しやすいものであれば、あまりチェックする必要はないでしょう。

 
...
   static int        sign;
   static int        _sign;
   static int        mean;
public:
...
   int               Get() const;
   static void       Print(int val);
private:
   int               GetInt12(int val) const {return ((val&sign)>>20)|(val&mean);}
   static int        GetInt(int val) {return (val&_sign)<<20|(val&mean);}
  };
...
//------------------------------------------------------------------------
int CSetting::Get() const{
   return t<<29|d<<26|v<<24|GetInt12(param1)<<12|GetInt12(param2);
}
//------------------------------------------------------------------------
void CSetting::Print(int val){
   PrintFormat("%s, %s, %s, %i, %i",EnumToString(T(val>>29)),EnumToString(D(val>>26)),EnumToString(V(val>>24)),GetInt(val>>12),GetInt(val));
}
int CSetting::sign=1<<31;
int CSetting::_sign=1<<11;
int CSetting::mean=0xFFFFFFFF>>21;
void OnStart(void)
  {
   CSetting test(Input_p1,Input_p2,Input_T,Input_D,Input_V);
   int res=test.Get();
   Print ("int=",res);
   CSetting::Print(res);
 }
 
Vladimir Simakov:

まあ、変数が増えるのは明らかなので、私としては構造体のバイトコピーで済ませた方がいいと思います(おそらく、この処理では速度の最適化は必要ないでしょうが、利便性は高くなるでしょう)。

 
void OnStart()
  {

   int a=9;
   int b=8;
   int c=7;
   int d=12345;

   int v=pack(a,b,c,d);
   
   int a2,b2,c2,d2;
   unpack(v,a2,b2,c2,d2);
   
   Alert(a2," ",b2," ",c2," ",d2);

}

void unpack(int val,int & a,int & b,int & c,int & d){
   d=val/1000;
   val%=1000;
   c=val/100;
   val%=100;   
   b=val/10;
   a=val%10;
}

int pack(int a,int b,int c,int d){
   return(a+b*10+c*100+d*1000);
}

安い、安い