Вопросы по ООП в MQL5 - страница 91

 
Dmitry Fedoseev:

С чего вдруг оно не будет работать? Три перечисления, ни одно из них не превышает 10. Арифметика средней школы второго класса.

3 перечисления плюс 2 int , нужно в 4 байта = int

int мне нужны в пределах +1000 -... +1000 , пипсов, это как раз 2^10 

int - ы можно еще подумать, шаг в 1 пипс не важен, можно и в 2.5-...9 пп , т.е. дискретность не сильно критична

 
Igor Makanu:

3 перечисления плюс 2 int , нужно в 4 байта

int мне нужны в пределах +1000 -... +1000 , пипсов, это как раз 2^10 

int - ы можно еще подумать, шаг в 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:

Побитовая распринтовка, не? Что то типо перевести число в стринг с побитовыми значениями. Одна для целых чисел другая для с точкой и проверяй. Это же только для отладочных целей

да это все ясно, но как автоматизировать проверку?

проблема, не в моем примере, а в том, что еще нужно запаковать в штуки 3 int другие данные, не охота на каждой упаковке много времени на проверки тратить


ЗЫ: мысль светлая, но не побитовые значения, а hex - из printf() можно получить , вернее из стрингформат()

 
Igor Makanu:

да это все ясно, но как автоматизировать проверку?

проблема, не в моем примере, а в том, что еще нужно запаковать в штуки 3 int другие данные, не охота на каждой упаковке много времени на проверки тратить


ЗЫ: мысль светлая, но не побитовые значения, а hex - из printf() можно получить , вернее из стрингформат()

)) не могу понять что надо

   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);
}

Дешево и сердито

Причина обращения: