Mql5 dilinin özellikleri, incelikleri ve çalışma yöntemleri - sayfa 161

 
printf ( "%s , %f , %i" ,( string ) NULL ,( double ) NULL ,( int ) NULL );

2020.01.27 01:15:57.859 tst (EURUSD,H1) (boş) , 0.000000 , 0

tip dökümünü kaldırırsanız, 'NULL' hatası olur - 'void' tipinin ifadesi yasa dışıdır

ilginç, nput dizesinin geçersiz kılmak için başlatılabileceği ortaya çıktı

 
fxsaber :

NULL - başlatma. Örnek, bilerek, girdi olmayan bir dize gösterir.

NULL / NIL (başka bir deyişle), bir dize sabit varlığının başlatılması olamaz.

en azından, çünkü mql dizgisi C'deki gibi bir "işaretçi" değildir. Özel bir "hiçbir şey" durumu yoktur.

PS (Oh, nasıl, bunu kendimden beklemiyordum)

 
Maxim Kuznetsov :

Özel bir "hiçbir şey" durumu yok

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Mql5 dilinin özellikleri, incelikleri ve çalışma yöntemleri

fxsaber , 2020.01.26 15:54

 void OnStart ()
{
   uchar Bytes[];

   Print ( StringToCharArray ( NULL , Bytes)); // 0
   Print ( StringToCharArray ( "" , Bytes));   // 1
}

Bu durumu her gün kullanıyorum.

 
Maxim Kuznetsov :

en azından, çünkü mql dizgisi C'deki gibi bir "işaretçi" değildir. Özel bir "hiçbir şey" durumu yoktur.

PS (Oh, nasıl, bunu kendimden beklemiyordum)

ne yazık ki, hayır, MQL'deki bir dize, ayrılmış belleğe sahip bir varlıktır, @Ilyas , StringBufferLen() öğesinin neden dizenin uzunluğunu göstermeyebileceğini, ancak tam olarak dizeyi depolamak için ayrılmış belleği gösterdiğini açıkladı


fxsaber :

Bu durumu her gün kullanıyorum.

hiç bir gösterge değil, MQL4'teki herhangi bir nesneye işaretçiler yazdırmak için StringConcatenate() kullandım. yerleşik işlevlerin çalışması MQL kurallarına göre uygulanmaz)))

 input string s = NULL ;
void OnStart ()
{
   uchar Bytes[];
   Print ( StringToCharArray ( NULL , Bytes));   // 0
   Print ( StringToCharArray ( "" , Bytes));     // 1
   Print ( StringToCharArray (s, Bytes));     // 1
}
 
Igor Makanu :

hiç bir gösterge değil, MQL4'teki herhangi bir nesneye işaretçiler yazdırmak için StringConcatenate() kullandım. yerleşik işlevlerin çalışması MQL kurallarına göre uygulanmaz)))

İçerisinin nasıl olduğu önemli değil.

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Mql5 dilinin özellikleri, incelikleri ve çalışma yöntemleri

Igor Makanu , 2020.01.26 22:27

 input string s = NULL ;
void OnStart ()
{
   uchar Bytes[];

   Print ( StringToCharArray (s, Bytes));     // 1
}
Çünkü NULL değil. Orijinal yazının konusu buydu.
 
fxsaber :

İçerisinin nasıl olduğu önemli değil.

mesajımı senin örneğinle güncelledim


Ayrıca giriş dizesi s = NULL; ile birkaç kez deneme yaptım.

Anladığım kadarıyla giriş değişkeninin değerini kullanmaya çalışmıyorken bu değer NULL olacak, ancak o anda bu giriş değişkeninin değerini başka bir değişkene atamaya çalışırsak veya sadece bu giriş değişkenini yazdırırsak , sonra bu NULL kaybolur, yani . bu giriş dizesi değişkenine bellek ayrılacak

 
Igor Makanu :

Anladığım kadarıyla giriş değişkeninin değerini kullanmaya çalışmıyorken bu değer NULL olacak, ancak o anda bu giriş değişkeninin değerini başka bir değişkene atamaya çalışırsak veya sadece bu giriş değişkenini yazdırırsak , sonra bu NULL kaybolur, yani . bu giriş dizesi değişkenine bellek ayrılacak

Giriş değişkeninin çalışma mekanizması yukarıda ayrıntılı olarak açıklanmıştır.

 
fxsaber :

İçerisinin nasıl olduğu önemli değil.

Çünkü NULL değil. Orijinal yazının konusu buydu.

(hala) referans kaldırma varlıklarının çalışmasının (ilişkilerinin) özellikleri var (peki, mql'de işaretçiler yok, C değil, varlıklar olsun)

input, başlangıçta bildirilen böyle bir const'tır. Fiziksel olarak "HİÇBİR ŞEY" değeri verilemez.

const string nothing=NULL; /// <--- ЭТО ЧТО ?

 
Nikolai Semko :

Evet, muhtemelen, böyle bir davranış sadece "aptaldan korunma" dır.
Giriş değişkeninin başlatılması gerektiği gerçeği göz önüne alındığında, değişken zaten bellekte en az bir bayt kaplıyorsa input = NULL yapay olarak ="" ile eşitlenir.

MQL5 girişlerinde:

kesinlikle aynı. Değişken için bellek ayrılmamıştır. Her neyse, hiçbir fark bulamadım.
Ve örneğin Java'da, her iki durumda da değişken için bellek ayrılmamasına rağmen, bu tür girişler küçük bir farka sahiptir. İlk seçenek (String str = null;) başlatılmış olarak kabul edilecektir, ancak değişken için bellek ayrılmamış ve değişken boş olarak yazdırılabilir. Ve ikinci durumda (String str;), bir değişkeni yazdırmaya çalışırken, başlatılmamış bir değişken hakkında bir hata üretilecektir.
Onlar. MQL5 bu konuda daha toleranslıdır.
Hangisi daha iyi, onu bile bilmiyorum.

Değişken için bellek nasıl tahsis edilmez?
Bellek tahsis edildi ve değişken rastgele çöp içeriyor.
Ve dizenin herhangi bir değer göstermemesi gerçeği, arabelleğin boş olması mantıklıdır.

 char    ch; 
short   sh;
int     in;
double db;       
string st;

Print ( sizeof (ch));
Print ( sizeof (sh));
Print ( sizeof (in));
Print ( sizeof (db));
Print ( sizeof (st));
Print ( "---------------------" );
Print (ch);
Print (sh);
Print (in);
Print (db);
Print (st);
 
Roman :

Değişken için bellek nasıl tahsis edilmez?
Bellek ayrılmış, ancak değişken rastgele çöp içermiyor.
Ve dizenin herhangi bir değer göstermemesi gerçeği, arabelleğin boş olması mantıklıdır.

 char ch; 
short sh;       
string st;

Print ( sizeof (ch));
Print ( sizeof (sh));
Print ( sizeof (st));

   string str1;
   string str2= "Однажды, в студёную зимнюю пору я из лесу вышел; был сильный мороз." ;
   Print ( sizeof (str1));   // 12
   Print ( sizeof (str2));   // 12
   uchar ch1[],ch2[];
   Print ( StringToCharArray (str1, ch1));   // 0
   Print ( StringToCharArray (str2, ch2));   // 68