bazı "StringToEnum" işlevi veya alternatifi var mı? - sayfa 2

 

Bunu takip ediyorum ama tam olarak neyi başarmak istediğinize dair net bir anlayışa sahip değilim.

Genelde, aradığım sonuca ulaşmak için farklı şekillerde yaparak şeyleri yeniden kodlarım, işler birçok şekilde yapılabilir.

 
Marco vd Heijden :

Bunu takip ediyorum ama tam olarak neyi başarmak istediğinize dair net bir anlayışa sahip değilim.

Genelde, aradığım sonuca ulaşmak için farklı şekillerde yaparak şeyleri yeniden kodlarım, işler birçok şekilde yapılabilir.

teşekkürler marco. Elbette işler birçok şekilde yapılabilir (ve geçici çözümler), bazen hedefinize ulaşmak için bunlardan birini seçmeniz gerekir, ancak bazı yöntemler diğerlerinden daha kolay. Bu durumda, işlevi taklit etmek için aldığım geçici çözüm: StringToEnum, "if" ile birden çok dize karşılaştırması kullanıyordu, ancak daha önce söylediğim gibi, eval işlevi (mql5'te uygulanmadı) tüm bunlardan kaçınmaya ve ayrıca bakıma yardımcı olabilir. çünkü sabitler isimlerini değiştirirse ifs bloğunu değiştirmeniz gerekmez.
 

tam olarak ne demek istediğini biliyorum, ihtiyacım olanı elde etmek için bir kod bloğunda yüzlerce, hatta bazen binlerce if satırına sahibim.

yaptığın işi sevmelisin

 
cyberglassed :
teşekkürler marco. Elbette işler birçok şekilde yapılabilir (ve geçici çözümler), bazen hedefinize ulaşmak için bunlardan birini seçmeniz gerekir, ancak diğerlerinden daha kolay bazı yollar vardır. Bu durumda, işlevi taklit etmek için aldığım geçici çözüm: StringToEnum, "if" ile birden çok dize karşılaştırması kullanıyordu, ancak daha önce söylediğim gibi, eval işlevi (mql5'te uygulanmadı) tüm bunlardan kaçınmaya ve ayrıca bakıma yardımcı olabilir. çünkü sabitler isimlerini değiştirirse ifs bloğunu değiştirmeniz gerekmez.

Bu StringToEnum'a NEDEN ihtiyacınız olduğunu açıklayabilir misiniz? Belli ki enum değerine sahip bir dizginiz var, ama neden dizgede? bilmek merak ediyorum.

Yani eval(...) fonksiyonunun desteği ile aynı anda birçok şeyi çözebiliriz.

Bu ASLA olmayacak, bununla zaman kaybetme. Eval() işlevi , güvenlik sızıntısına açık bir kapıdır, Metaquotes böyle bir işlevi eklemeyecektir.

 
Marco vd Heijden :

tam olarak ne demek istediğini biliyorum, ihtiyacım olanı elde etmek için bir kod bloğunda yüzlerce, hatta bazen binlerce if satırına sahibim.

yaptığın işi sevmelisin

Sorununuz bir StringToEnum() ile çözülemez , bunu zaten biliyorsunuz (sanırım).
 
Alain Verleyen :
Sorununuz bir StringToEnum() ile çözülemez , bunu zaten biliyorsunuz (sanırım).

Doğru ama geriye doğru yapılabilir.

   int b= 0 ;
  
   if ( EnumToString ( MODE_SMMA )== "MODE_SMMA" ){b= 2 ; Print ( "b= " ,b);}

Ama MODE_SMMA zaten 2 tamsayı değerine sahip olduğu için anlamsız olurdu, bu yüzden siberglaslığın neyi başarmaya çalıştığını anlamadığımı yazdım.

 
Marco vd Heijden :

Doğru ama geriye doğru yapılabilir.

Ama MODE_SMMA zaten 2 tamsayı değerine sahip olduğu için anlamsız olurdu, bu yüzden siberglaslığın neyi başarmaya çalıştığını anlamadığımı yazdım.

Marco , kullandığım geçici çözüm aşağıdaki gibi bir şey (çok minimalist sürüm):

 int StringToEnum( string strId) {
         if ( false ) {}
         else if (strId == "PRICE_CLOSE" )     return 1 ;
         else if (strId == "PRICE_OPEN" )      return 2 ;
         else if (strId == "PRICE_HIGH" )      return 3 ;
         else if (strId == "PRICE_LOW" )       return 4 ;
         else if (strId == "PRICE_MEDIAN" )    return 5 ;
         else if (strId == "PRICE_TYPICAL" )   return 6 ;
         else if (strId == "PRICE_WEIGHTED" )  return 7 ;
        // ...
         return - 1 ;
}

void OnStart () {
         string strId = "PRICE_MEDIAN" ;
         printf ( "%s: %d " , strId, StringToEnum(strId));
}

Tabii ki sabitten başlamıyorum, bir dizeden başlıyorum, bunu söylüyorum çünkü kodunuzda aşağıdakileri yazdınız:

 EnumToString ( MODE_SMMA )

sanki baştan sabitin kendisine sahipmişsiniz gibi.

Seni yanlış anladıysam özür dilerim, ingilizcem çok iyi değil.

Saygılarımızla.

 
Alain Verleyen :

Bu StringToEnum'a NEDEN ihtiyacınız olduğunu açıklayabilir misiniz? Belli ki enum değerine sahip bir dizginiz var, ama neden dizgede? bilmek merak ediyorum.

Yani eval(...) fonksiyonunun desteği ile aynı anda birçok şeyi çözebiliriz.

Bu ASLA olmayacak, bununla zaman kaybetme. Eval() işlevi, güvenlik sızıntısına açık bir kapıdır, Metaquotes böyle bir işlevi eklemeyecektir.

Merhaba Alain, merakınızı giderdim :P

Birden çok harici mql5 kodu kullandığınızı, o zaman üzerlerinde tanımlanmış birden çok "enum" veri türüyle uğraştığınızı ve elbette bir insan gibi, her "enum" değerinin dize adını hatırlamanız sizin için daha iyidir. . Sonra bazı kısımlarda string formatında bazı enum değerleri belirtmek istiyorsunuz, o zaman bunu doğrudan yapamazsınız, bu yüzden yukarıda yazdığım gibi bazı geçici çözümler kullanmanız gerekir. Bunun iki büyük dezavantajı vardır, birincisi, ilgili tüm numaralandırmaların tüm değerlerini toplamanız gerekir ve ikinci dezavantaj, bakımdır, bu nedenle geliştiricinin bazı sabit temsillerle ilişkili int değerini değiştirdiği bazı harici mql5 kodunu güncellerseniz, o zaman yapabilirsiniz. beklenmeyen davranışlar elde edin, bu nedenle koddaki güncellemeleri incelemeye devam etmeniz gerekir.

Güvenlik sızıntısı konusu hakkında... Güvenlik sızıntısına açık bir kapı olduğu konusunda söylediklerinize tam olarak katılmıyorum. Tabii ki bu açık bir kapı olabilir, ancak programcı olarak sınırları belirlemeli ve olası kritik durumlarla ilgilenmelisiniz, yani PHP'deki gibi durumları mükemmel bir şekilde yönetebilirsiniz, hatta bazılarını ayrıştırmanız gereken kod enjeksiyonu ile SQL'de bile. kodunuza erişimleri olması durumunda kullanıcılardan gelen kritik olası giriş verileri.

Belki gelecekte çok az şansımız olur ve geliştirici ekibi bu konuda bize biraz yardım edebilir, bu yüzden şimdilik geçici çözümler kullanabiliriz: P

 
cyberglassed :

Marco , kullandığım geçici çözüm aşağıdaki gibi bir şey (çok minimalist sürüm):

Tabii ki sabitten başlamıyorum, bir dizeden başlıyorum, bunu söylüyorum çünkü kodunuzda aşağıdakileri yazdınız:

sanki baştan sabitin kendisine sahipmişsiniz gibi.

Seni yanlış anladıysam özür dilerim, ingilizcem çok iyi değil.

Saygılarımızla.

Bu nedenle geriye doğru çağrılır ve dizgedeki enum değerini çözmek için tüm numaralandırmaları karşılaştırarak başlarsınız.

 int b;
if ( EnumToString ( MODE_SMA )== "MODE_SMA" ){b= 0 ;}
if ( EnumToString ( MODE_EMA )== "MODE_EMA" ){b= 1 ;}
if ( EnumToString ( MODE_SMMA )== "MODE_SMMA" ){b= 2 ;}
if ( EnumToString ( MODE_LWMA )== "MODE_LWMA" ){b= 3 ;}

Print (b);


ama bu aynı şey değil mi?

sting'i hangi tarafta karşılaştırdığınız önemli değil, eşleşme varsa değeri b'ye işaretleyecektir.

 int b;
if ( "MODE_SMA" == EnumToString ( MODE_SMA )){b= 0 ;}
if ( "MODE_EMA" == EnumToString ( MODE_EMA )){b= 1 ;}
if ( "MODE_SMMA" == EnumToString ( MODE_SMMA )){b= 2 ;}
if ( "MODE_LWMA" == EnumToString ( MODE_LWMA )){b= 3 ;}

Print (b);

yani burada bir dize değeriyle başlıyoruz ama fark nedir?

Hiçbiri.

 
Marco vd Heijden :

...

ama bu aynı şey değil mi?

sting'i hangi tarafta karşılaştırdığınız önemli değil, eşleşme varsa değeri b'ye işaretleyecektir.

 int b;
if ( "MODE_SMA" == EnumToString ( MODE_SMA )){b= 0 ;}
if ( "MODE_EMA" == EnumToString ( MODE_EMA )){b= 1 ;}
if ( "MODE_SMMA" == EnumToString ( MODE_SMMA )){b= 2 ;}
if ( "MODE_LWMA" == EnumToString ( MODE_LWMA )){b= 3 ;}

Print (b);

yani burada bir dize değeriyle başlıyoruz ama fark nedir?

Hiçbiri.

yukarıdaki kodunuz işe yaramaz çünkü her zaman "b = 3" döndürür ("else if" kullanmadığınız için son "if")

"else if" kullanırsanız, her zaman "b = 0" döndürür.

neyse, bilgi: "b = 3" her seferinde herhangi bir bilgi vermiyor.

Neden: