Hatalar, hatalar, sorular - sayfa 2566

[Silindi]  
Slava :

Bu döküm ile veri kaybı olmaz. 0 veya 0 değil.

Başka bir şey, double kullanıldığında -> herhangi bir tamsayı türü (int32'ye kadar ve dahil)

Uyarılarla oynadığınız bir şey bence, yargılarda yeterli tutarlılık yok

 bool continuation() const { return this .last_level;}   // uint last_level
// expression not boolean	lrp_last_9.mq5	260	42
 
Vict :

Uyarılarla oynadığınız bir şey bence , yargılarda yeterli tutarlılık yok

Kabul ediyorum

Burada da bu anlamda veri kaybı olmaz ( 0 olsun veya olmasın 0 olsun)

 void OnStart ()
{
         int i = -1 ;
         while ( ++i ); //Warning: expression not boolean
}

ama bir uyarı var. Tek tip yaklaşım bekleniyor

 

Aynı sınıfın statik bir işlevinden bir sınıf örneğinin özelliğine erişme girişiminin sonucu:

2019.09.18 20:07:41.043 Test_exec (EURUSD,M5)   Access violation at 0x000001E9CCD2963C read to 0x0000000000000014 in 'D:\Alpari MT5\MQL5\Scripts\Test_exec.ex5'
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)      crash -->  000001E9CCD2963C 837B1400          cmp        dword [rbx+0x14], 0x0
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)                 000001E9CCD29640 0F8E8F020000      jle        dword 0x1e9ccd298d5
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)   
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)                 000001E9CCD29646 90                nop        
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)   
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)   00: 0x000001E9CCD2963C
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)   01: 0x000000B56CA2F120
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)   02: 0x000001E9CCD2A04D
Derleyici daha önce sessizdi.
 

Terminal sıfır ile boş bir dize başlatmaz.

 void OnStart ()
{      
   string str;
   StringInit (str, 100 , 0 );
   
   Print ( StringLen (str));     
}

Sonuç

 2019.09 . 18 22 : 16 : 54.380 TestScript (EURUSD,H1)   0

beklenen

 2019.09 . 18 22 : 16 : 54.380 TestScript (EURUSD,H1)   100

StringInit işlevinin yardımında not edin

Примечание

Если  character= 0 и размер new_len> 0 , то будет распределен буфер строки указанного размера и заполнен нулями. 
Размер строки будет равен нулю , так как весь буфер заполнен терминаторами строки.

Aslında dağıtım yok.
yani bu şekilde dağıtım, on boşluk

 string str = "          " ;

Aynısı değil

 string str;
StringInit (str, 10 , 0 );

Ve bir şekilde yardım metninde kırmızı ile vurgulanan davranış mantığı birleşmiyor.

 
Vict :

Uyarılarla oynadığınız bir şey bence, yargılarda yeterli tutarlılık yok

boole uyarı işlemleri için çalışmıyor, şimdi yanlışlıkla kodumda bir yazım hatası fark ettim, burada yeniden oluşturdum:

 #define               getAsk(dummy)           SymbolInfoDouble ( _Symbol , SYMBOL_ASK )
#define               getBid(dummy)           SymbolInfoDouble ( _Symbol , SYMBOL_BID )
//+------------------------------------------------------------------+
void OnStart ()
  {
       double sl = 0.0 ,tp= 0.0 ;
       if (sl != ! OrderStopLoss() || tp != OrderTakeProfit()) Print ( "" );  
  }
//+------------------------------------------------------------------+

double OrderStopLoss()
{
   return (getAsk());
}

double OrderTakeProfit()
{
   return (getBid());
}
 
Roman :

Terminal sıfır ile boş bir dize başlatmaz.

Sonuç

beklenen

StringInit işlevinin yardımında not edin

Aslında dağıtım yok.
yani bu şekilde dağıtım, on boşluk

Aynısı değil

Ve bir şekilde yardım metninde kırmızı ile vurgulanan davranış mantığı birleşmiyor.

StringBufferLen işlevini kaçırdınız - ayrılan arabelleğin boyutunu döndürür. StringLen, dizgenin uzunluğunu, yani en başındaysa sırasıyla terminal karakterine kadar olan uzunluğu döndürür - uzunluk 0. Tampon != dize.

 
Stanislav Korotky :

StringBufferLen işlevini kaçırdınız - ayrılan arabelleğin boyutunu döndürür. StringLen, dizgenin uzunluğunu, yani en başındaysa sırasıyla terminal karakterine kadar olan uzunluğu döndürür - uzunluk 0. Tampon != dize.

Ve kendisi bilmiyor

 
Stanislav Korotky :

StringBufferLen işlevini kaçırdınız - ayrılan arabelleğin boyutunu döndürür.
StringLen, dizgenin uzunluğunu, yani en başındaysa sırasıyla terminal karakterine kadar olan uzunluğu döndürür - uzunluk 0. Tampon != dize.

Bu anlaşılabilir bir durumdur, bir dizgeyi sıfır uçlarıyla başlatmaktan bahsediyoruz.
Neden StringInit(str, 10, 0); on terminal sıfırı ile doldurmuyor musunuz? Ve dizenin gerçek uzunluğunu döndürün.
Boş bir dize başlatmanız gerekiyorsa, dolgu yok! örneğin 100 karakter,
sonra ya str = "klavyeye çok fazla dürtme" biçiminde 100 boşluk bırakın ya da çöp StringInit(str, 100, 65) ile başlatın
Neden çöple başlatıldığını anlamıyorum, zaten yeterli))


[Silindi]  
Roman :

Bu anlaşılabilir bir durumdur, bir dizgeyi sıfır uçlarıyla başlatmaktan bahsediyoruz.
Neden StringInit(str, 10, 0); on terminal sıfırı ile doldurmuyor musunuz? Ve dizenin gerçek uzunluğunu döndürün.
Boş bir dize başlatmanız gerekiyorsa, dolgu yok! örneğin 100 karakter,
sonra ya str = "klavyeye çok fazla dürtme" biçiminde 100 boşluk bırakın ya da çöp StringInit(str, 100, 65) ile başlatın
Neden çöple başlatıldığını anlamıyorum, zaten yeterli))


Ve doldurulmadığını nereden çıkardın? Sadece dizedeki uzunluk mikrolitre cinsinden saklanmaz, ancak terminal sıfır tarafından tanınır.

 StringInit (str, 100 , ' ' );

olumsuzluk?

Ve tam olarak sıfırlara ihtiyacınız varsa, o zaman μl std'nin bağırsaklarında bir yerde bir String sınıfı vardır.

 
Vict :

Doldurulmadığını da nereden çıkardın? Sadece dizedeki uzunluk mikrolitre cinsinden saklanmaz, ancak terminal sıfır tarafından tanınır.

olumsuzluk?

Ve tam olarak sıfırlara ihtiyacınız varsa, o zaman μl std'nin bağırsaklarında bir yerde bir String sınıfı vardır.

Hayır. Bu da sıfır döndürür. Ve üçüncü parametre olan ushort, bir tamsayı karakter kodu gerektirir.

Eğer str = " " biçiminde başlatırsam; ve sonra verileri dll'den aktarıyorum, sonra her şey yolunda.
Ve eğer StringInit(str, 10, 0)'ı başlatırsam hiçbir veri alınmaz. Çünkü gerekli boyutta bir dize için bellek ayrılmamıştır .

Bir boşluk kodu olsaydı işe yarayabilirdi ama bir şekilde farklı tablolarda böyle bir kod bulamadım.
Daha sonra zaten başlatılmış, boş bir dizgeye gidecek olan gelecekteki karakterlerin sayısı için bellek ayırmak gerekir.
Ama bir dizgeyi başlatmak için çöp, comme il faut değil.
Bu nedenle StringInit(str, 100, 0); terminal sıfırları ile doldurulmalı ve 100 uzunluğunda döndürülmelidir.