Особенности языка mql5, тонкости и приёмы работы - страница 160

 
Alexey Viktorov:

NULL такая неопределённость, что с ней надо внимательно разбираться.

void OnStart()
{
  uchar Bytes[];

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

Еще раз, input-строка не может быть NULL (принудительно делается ""). Остальные строки - могут.

 
fxsaber:

Еще раз, input-строка не может быть NULL (принудительно делается ""). Остальные строки - могут.

input - почти синоним const, const должен быть инициализован
 
fxsaber:

Еще раз, input-строка не может быть NULL (принудительно делается ""). Остальные строки - могут.

Опять-же почему вы считаете, что такое преобразование не должно быть? Чтобы всё это объяснить моих знаний и опыта не хватает. Потому оставайтесь при своём мнении. Надеюсь разработчики не пойдут на поводу и не станут менять это.

 
Alexey Viktorov:

Опять-же почему вы считаете, что такое преобразование не должно быть?

Отлично знаю, почему такое преобразование происходит. Здесь речь об особенности, а не о баге.

 
Maxim Kuznetsov:
input - почти синоним const, const должен быть инициализован

NULL - инициализация. Специально же в примере показана не input-строка.

 
fxsaber:
 Хорошо бы предупреждение генерировать на этапе компиляции.

Да, наверное, такое поведение - просто "защита от дурака".
Видно, ввиду того, что input переменная должна быть проинициализирована, то в инпут = NULL исскуственно приравнивается к ="", когда переменная уже занимает хотя бы один байт в памяти.

В MQL5 записи:

string str=NULL;
string str;

абсолютно идентичны. Памяти под переменную не выделяется. Во всяком случае я не нашел различий. 
А в java, например, такие записи имеют небольшое различие, не смотря на то, что в обоих случаях тоже не выделяется памяти под переменную. Первый вариант (String str = null;) будет считаться проинициализированным, хотя памяти под переменную не выделяеся, и переменную можно распечатать как пустую. А во втором случае(String str;) при попытке печати переменной будет генерироваться ошибка о непроинициализированной переменной.
Т.е. MQL5 в этом плане более толерантный.
Что лучше, даже не знаю.

 
Nikolai Semko:

Видно, ввиду того, что input переменная должна быть проинициализирована, то в инпут = NULL исскуственно приравнивается к ="", когда переменная уже занимает хотя бы один байт в памяти.

NULL - это не инициализация, а значение. Вы можете любой non-const string-переменной присвоить NULL  в середине кода. И она будет равна NULL.

input не равна NULL, потому что при запуске создается невидимый set-файл. И из этого файла "парсингом" идут значения переменных в input-ы. Ну а парсинг ни при каком раскладе не может выдать NULL, поэтому помещает туда пустую строку.

Такое поведение только у input-string. Для const-string и остальных - все в норме, конечно.
 
fxsaber:

NULL - это не инициализация, а значение. Вы можете любой non-const string-переменной присвоить NULL  в середине кода. И она будет равна NULL.

input не равна NULL, потому что при запуске создается невидимый set-файл. И из этого файла "парсингом" идут значения переменных в input-ы. Ну а парсинг ни при каком раскладе не может выдать NULL, поэтому помещает туда пустую строку.

ну так я о том же. Я согласен.
Единственное, что в присвоении стрингу значения NULL на этапе объявления переменной нет никакого смысла:

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

имеет смысл это делать только для обнуления уже проинициализированной переменной в памяти.

 
Nikolai Semko:

ну так я о том же. Я согласен.
Единственное, что в присвоении стрингу значения NULL на этапе объявления переменной нет никакого смысла:

имеет смысл это делать только для обнуления переменной в памяти.

#define DEFAULT_VALUE NULL

string Str = DEFAULT_VALUE;

if (Str == DEFAULT_VALUE)
  ...

Здесь NULL-инициализация имеет смысл.

 
fxsaber:

Здесь NULL-инициализация имеет смысл.

да