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

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

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

если убрать приведение типов, то будет ошибка 'NULL' - expression of 'void' type is illegal

занятно,  получается, что nput string может быть инициализирован void 

 
fxsaber:

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

NULL / NIL (в прочих терминах) не могут быть инициализацией константной сущности строки.

хотя-бы в потому что mql строка не является "указателем" как в C. У неё нет специального состояния "вообще совсем ничто"

PS (о как, сам от себя такого не ожидал)

 
Maxim Kuznetsov:

У неё нет специального состояния "вообще совсем ничто"

Каждый день это состояние использую.

 
Maxim Kuznetsov:

хотя-бы в потому что mql строка не является "указателем" как в C. У неё нет специального состояния "вообще совсем ничто"

PS (о как, сам от себя такого не ожидал)

увы нет, строка в MQL это сущность с выделенной памятью, @Ilyas объяснял, почему StringBufferLen() может не показывать длину строки, а показывает именно выделенную память под хранение строки


fxsaber:

Каждый день это состояние использую.

вооообще не показатель, я так в MQL4 через StringConcatenate() распринтовывал указатели на любой обьект, т.е. работа встроенных функций реализована не по правилам MQL )))

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

вооообще не показатель, я так в MQL4 через StringConcatenate() распринтовывал указатели на любой обьект, т.е. работа встроенных функций реализована не по правилам MQL )))

Без разницы, как внутри.

Потому что не NULL. Об этом исходное сообщение было.
 
fxsaber:

Без разницы, как внутри.

дополнил свой пост, Вашим примером


пару раз еще делал эксперименты с input string s = NULL;

насколько я понял, что пока мы не пытаемся использовать значение инпут-переменной - это значение будет NULL, но в тот момент если мы попробуем присвоить значение этой инпут переменно другой переменной или просто распринтовать эту инпут-переменную,  то этот NULL исчезает, т.е. этой инпут-стриг переменной будет выделена память

 
Igor Makanu:

насколько я понял, что пока мы не пытаемся использовать значение инпут-переменной - это значение будет NULL, но в тот момент если мы попробуем присвоить значение этой инпут переменно другой переменной или просто распринтовать эту инпут-переменную,  то этот NULL исчезает, т.е. этой инпут-стриг переменной будет выделена память

Механизм работы input-переменной подробно описал выше.

 
fxsaber:

Без разницы, как внутри.

Потому что не NULL. Об этом исходное сообщение было.

есть (всё ещё) специфика работы (отношений) разыменования сущностей (ну нету в mql указателей, он не С, пусть будут сущности)

input - это такой const объявляемый при запуске.ему физически нельзя дать значение "НИЧЕГО"

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

 
Nikolai Semko:

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

В MQL5 записи:

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

Как это память под переменную не выделяется?
Память выделяется, и переменная содержит произвольный мусор.
А то что стринг не выводит не каких значений, логично же что буфер пустой.

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:

Как это память под переменную не выделяется?
Память выделяется, но переменная не содержит произвольный мусор.
А то что стринг не выводит не каких значений, логично же что буфер пустой.

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
Причина обращения: