MQL5'te OOP hakkında sorular - sayfa 91

 
Dmitry Fedoseev :

Neden aniden çalışmıyor? Üç numaralandırma, hiçbiri 10'dan büyük değil. Lise 2. sınıf aritmetiği.

3 numaralandırma artı 2 int , 4 bayta ihtiyaç var = int

+1000 -... +1000 içinde int'ye ihtiyacım var, pip, sadece 2^10

int - yine de düşünebilirsiniz, 1 piplik bir adım önemli değil, 2.5-...9 pp'de mümkündür, yani. ayrıklık çok kritik değil

 
Igor Makanu :

4 baytta gerekli 3 numaralandırma artı 2 int

+1000 -... +1000 içinde int'ye ihtiyacım var, pip, sadece 2^10

int - yine de düşünebilirsiniz, 1 piplik bir adım önemli değil, 2.5-...9 pp'de mümkündür, yani. ayrıklık çok kritik değil

Yeterince fazla alan. INT_MAX=2147483647 .

Hala aptalca ve doğrudan yapamazsınız - düzinelerce, ancak ekonomik olarak arka arkaya - 8 * 8 * 4. Sadece düşünmeniz gerekiyor)) Ama gerek yok, her şey uyuyor ve öyle.

Ve kontrol etmek için - neden döngüyü INT_MAX'e kadar karıştırmıyorsunuz - demir makinesi sonuçların bulunduğu dosyayı görüntülemek için değil kontrol edecektir.

 
Dmitry Fedoseev :

Yeterince fazla alan. INT_MAX=2147483647 .

Hala aptalca ve doğrudan yapamazsınız - düzinelerce, ancak ekonomik olarak arka arkaya - 8 * 8 * 4. Sadece düşünmeniz gerekiyor)) Ama gerek yok, her şey uyuyor ve öyle.

Ve kontrol etmek için - neden döngüyü INT_MAX'a kadar karıştırmıyorsunuz - demir makinesi sonuçların bulunduğu dosyayı görüntülemek için değil kontrol edecektir.

umursamıyorum ... değerlendirmek için kod gerekiyor ve doğrulama tekniği nasıl dönüştürüleceğinden daha önemli

 
Igor Makanu :

umursamıyorum ... değerlendirmek için kod gerekiyor ve doğrulama tekniği nasıl dönüştürüleceğinden daha önemli

Bit-bit çıktı, ha? Bir sayıyı bitsel değerlere sahip bir dizgeye dönüştürmek gibi bir şey. Biri tamsayılar için diğeri noktalı ve kontrol için. Bu sadece hata ayıklama amaçlıdır.

 
Alexandr Andreev :

Bit-bit çıktı, ha? Bir sayıyı bitsel değerlere sahip bir dizgeye dönüştürmek gibi bir şey. Biri tamsayılar için, diğeri noktalı ve kontrol için. Bu sadece hata ayıklama amaçlıdır.

Evet, her şey açık, ancak kontrol nasıl otomatikleştirilir?

sorun, benim örneğimde değil, başka nelerin parçalara ayrılması gerektiği konusunda 3 int diğer veriler, her paket için avlanmamak, çeklere çok fazla zaman harcamak


Not: fikir parlak, ancak bitsel değerler değil, onaltılık - printf() 'dan veya daha ziyade stringformat()'tan alabilirsiniz

 
Igor Makanu :

Evet, her şey açık, ancak kontrol nasıl otomatikleştirilir?

sorun, benim örneğimde değil, başka nelerin parçalara ayrılması gerektiği konusunda 3 int diğer veriler, her paket için avlanmamak, çeklere çok fazla zaman harcamak


Not: fikir parlak, ancak bitsel değerler değil, onaltılık - printf() veya daha doğrusu stringformat() 'dan alabilirsiniz.

)) Neye ihtiyaç olduğunu anlayamıyorum

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

Ofseti otomatikleştirmek mi istiyorsunuz?

Çek ne?

Evet ve her zaman kontrol edebiliriz, sadece kaynağı ve neyin dönüştürüldüğünü kontrol edin.

 
Igor Makanu :

umursamıyorum ... değerlendirmek için kod gerekiyor ve doğrulama tekniği nasıl dönüştürüleceğinden daha önemli

Dönüştürme tekniği açık ve anlaşılırsa, doğrulama özellikle gerekli değildir.

 
...
   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 :

Benim için daha fazla değişken olacağı açık, bu yüzden bunun için yapıların bayt bayt kopyalanmasını kullanmak daha iyidir (büyük olasılıkla süreç hız açısından güçlü bir optimizasyon gerektirmez, ancak kolaylık olacaktır. en iyi)

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

Ucuz ve neşeli