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

 
Alexey Viktorov :

NULL, dikkatle ele alınması gereken bir belirsizliktir.

 void OnStart ()
{
   uchar Bytes[];

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

Bir kez daha, giriş dizesi NULL olamaz ( "" olmaya zorlanır). Satırların geri kalanı - olabilir.

 
fxsaber :

Bir kez daha, giriş dizesi NULL olamaz ( "" olmaya zorlanır). Satırların geri kalanı - olabilir.

input const ile neredeyse eş anlamlıdır, const başlatılmalıdır
 
fxsaber :

Bir kez daha, giriş dizesi NULL olamaz ( "" olmaya zorlanır). Satırların geri kalanı - olabilir.

Yine, neden böyle bir dönüşümün olmaması gerektiğini düşünüyorsunuz? Bütün bunları açıklamaya benim bilgim ve deneyimim yetmez. Bu nedenle, fikrinizle kalın. Umarım geliştiriciler devam etmeyecek ve bunu değiştirmeyeceklerdir.

 
Alexey Viktorov :

Yine, neden böyle bir dönüşümün olmaması gerektiğini düşünüyorsunuz?

Böyle bir dönüşümün neden gerçekleştiğini çok iyi biliyorum. Bu bir özellik, bug değil.

 
Maxim Kuznetsov :
input const ile neredeyse eşanlamlıdır, const başlatılmalıdır

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

 
fxsaber :
Derleme zamanında bir uyarı oluşturmak güzel olurdu.

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:

 string str= NULL ;
string str;

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.

 
Nikolai Semko :

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.

NULL bir başlatma değil, bir değerdir. Kodun ortasındaki herhangi bir const olmayan dize değişkenine NULL atayabilirsiniz. Ve NULL olacak.

giriş NULL değil çünkü başlangıçta görünmez bir küme dosyası oluşturuluyor. Ve bu dosyadan "ayrıştırma" değişkenlerin değerleri girdilere gider. Eh, ayrıştırma hiçbir durumda NULL üretemez, bu yüzden oraya boş bir dize koyar.

Bu davranış yalnızca giriş dizesi içindir. const-string ve geri kalanı için - elbette her şey yolunda.
 
fxsaber :

NULL bir başlatma değil, bir değerdir. Kodun ortasındaki herhangi bir const olmayan dize değişkenine NULL atayabilirsiniz. Ve NULL olacak.

başlangıçta görünmez bir küme dosyası oluşturulduğundan giriş NULL değil. Ve bu dosyadan "ayrıştırma" değişkenlerin değerleri girdilere gider. Eh, ayrıştırma hiçbir durumda NULL üretemez, bu yüzden oraya boş bir dize koyar.

valla bende aynı şeyden bahsediyorum Kabul ediyorum.
Tek şey, bir değişken bildirme aşamasında bir dizeye NULL değeri atamanın bir anlamı olmamasıdır:

 string str1 = NULL ;
string str2;
PRINT((str1== NULL ));   // true
PRINT((str2== NULL ));   // true

Bunu yalnızca bellekte zaten başlatılmış bir değişkeni sıfırlamak için yapmak mantıklıdır.

 
Nikolai Semko :

valla bende aynı şeyden bahsediyorum Kabul ediyorum.
Tek şey, bir değişken bildirme aşamasında bir dizeye NULL değeri atamanın bir anlamı olmamasıdır:

Bunu yalnızca bellekteki değişkeni sıfırlamak için yapmak mantıklıdır.

 #define DEFAULT_VALUE NULL

string Str = DEFAULT_VALUE;

if (Str == DEFAULT_VALUE)
  ...

NULL başlatmanın anlamlı olduğu yer burasıdır.

 
fxsaber :

NULL başlatmanın anlamlı olduğu yer burasıdır.

Evet