MQL5中的OOP问题 - 页 91

 
Dmitry Fedoseev:

为什么会突然不工作了呢?三个数,都不超过10。 初中二年级的算术题。

3个枚举加2个int,你需要4个字节=int

我需要在+1000 -...+1000 ,点子,这只是2^10

英特是值得考虑的,1个点的步骤并不重要,2.5-...9个点也是可能的,也就是说,离散性并不十分关键。

 
Igor Makanu:

3个枚举加2个int,需要4个字节。

我需要在+1000 -...+1000 ,点子,这只是2^10

英镑是值得考虑的,1个点的增量并不重要,你可以有2.5-...9个点,也就是说,离散性并不是那么关键。

空间绰绰有余。int_max=2147483647

我们可以用几十块钱来代替直截了当的直白,把它变成8*8*4的稀罕物。只有你需要思考)))。但没有必要,反正一切都适合。

为了检查--为什么不开始循环到INT_MAX--硬件会检查它,而不是自己去翻阅有结果的文件。

 
Dmitry Fedoseev:

足够多的空间。int_max=2147483647

你也可以不笨不直--几十块钱就能占到,而且经济上也能在紧要关头做到--8*8*4。只有你需要思考)))。但没有必要,反正一切都适合。

为了检查--为什么不使循环达到INT_MAX--它将被硬件检查,我们不需要自己去翻看结果文件。

我不介意...我需要代码来评估,方法论比如何转换更重要。

 
Igor Makanu:

我不介意...我需要代码来评估,测试方法比如何转换更重要。

比特式引物,不是吗?这就像用位值将数字转换为字符串一样。一个用于整数,一个用于点和检查。这只是为了调试的目的。

 
Alexandr Andreev:

比特式反写,不是吗?类似于用bitwise值串起一个数字。一个用于整数,一个用于点和检查。这只是为了调试的目的。

是的,这很清楚,但你如何将验证工作自动化?

问题不在于我的例子,而在于我还需要打包3个其他数据的int,我不想花太多时间去检查每一个打包。


ZS:这个想法很好,但不是位数,而是十六进制--从printf() 可以得到,或者说从stringformat()可以得到。

 
Igor Makanu:

是的,这一切都很清楚,但如何使检查自动化?

问题不在于我的例子,而在于我还需要打包3个int的其他数据,我不想花大量的时间去检查每一个打包。


HH:好主意,但不是位数,而是十六进制--我们可以从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);
}

廉价和便宜