Почему input string не имеют значение NULL? - страница 2

 

Вероятно, в мкл стринг это не ссылочный тип данных, а примитив, поэтому он не нулл, а пустая строка.

Не удивлюсь что возможно здесь можно стринговые переменные сравнивать напрямую через == на равенство значений, а не ссылок. 

Думаю легче запомнить эти фичи, и иметь это ввиду. 

Все таки это прикладной мкл... 

 
o_O:

плохо читаете.

Input это как минимум не extern . Он ближе к #define

и тем более не глобальная переменная

---

вы лучше попробуйте в коде задать этому input другое значение, например в OnInit.

Будете удивлены наверно

Вы меня за лоха-малолетку держите? ))) Написал же в третьем посте

"Input string - глобальная константная переменная и должна инициализироваться как NULL, если пользователь не задал значение." 

Ни к каким дефайнам переменные с модификатором input отношения не имеют, так как имеют заданный тип. Насчет глобальности даже говорить не буду - основы.

 
Stanislav Aksenov:

Вероятно, в мкл стринг это не ссылочный тип данных, а примитив, поэтому он не нулл, а пустая строка.

Не удивлюсь что возможно здесь можно стринговые переменные сравнивать напрямую через == на равенство значений, а не ссылок. 

Думаю легче запомнить эти фичи, и иметь это ввиду. 

Все таки это прикладной мкл... 

А теперь посмотрите пожалуйста картинку в певом посте еще раз. Ясно видно, что неинициализированные глобальная strGlobal и локальная symbol имеют при старте значение NULL.
 
Stanislav Aksenov:

Вероятно, в мкл стринг это не ссылочный тип данных, а примитив, поэтому он не нулл, а пустая строка.

Не удивлюсь что возможно здесь можно стринговые переменные сравнивать напрямую через == на равенство значений, а не ссылок. 

Думаю легче запомнить эти фичи, и иметь это ввиду. 

Все таки это прикладной мкл... 

Я не хочу запоминать фичи, как в MQL4 < build 600. Я хочу программировать на однозначном языке.
 
Alexey Volchanskiy:

Вы меня за лоха-малолетку держите? ))) Написал же в третьем посте

"Input string - глобальная константная переменная и должна инициализироваться как NULL, если пользователь не задал значение."

вы написали то как вам хочется, придали какой то понятный вам смысл,

а не то как есть на самом деле https://www.mql5.com/ru/docs/basis/variables/inputvariables

--

И в С++  никакие NULL вам не должны задаваться априори.

 
Alexey Volchanskiy:
Все ясно, пишу в СД..

А смысл? Чем Вам мешает пустая строка?

Входные переменные привязаны к полям в форме.

Если Вы не задали никакого значения переменной типа int, то будет подразумеваться значение 0

Если Вы не задали никакого значения переменной типа bool, то будет подразумеваться значение false (то есть опять же 0).

Если Вы не задали никакого значения переменной типа string, то будет подразумеваться опять же 0. В смысле терминирующий 0, то есть пустая строка. А почему пустая строка (L""), а не NULL (отсутствие какого-либо буфера у строки)? Да чтобы не нарваться на неприятности при дальнейшем использовании этой переменной. Напоминаю, что входные переменные являются константными по определению и не могут быть изменены внутри программы.
 
o_O:

вы написали то как вам хочется, придали какой то понятный вам смысл,

а не то как есть на самом деле https://www.mql5.com/ru/docs/basis/variables/inputvariables

--

И в С++  никакие NULL вам не должны задаваться априори.

Мы говорим о MQL5. Будьте добры, посмотрите скриншот в первом посте, там ясно видно под отладчиком, что глобальная неинициализированная переменная string strGlobal имеет значения NULL при старте скрипта.

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

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

 
Slawa:

А смысл? Чем Вам мешает пустая строка?

Входные переменные привязаны к полям в форме.

Если Вы не задали никакого значения переменной типа int, то будет подразумеваться значение 0

Если Вы не задали никакого значения переменной типа bool, то будет подразумеваться значение false (то есть опять же 0).

Если Вы не задали никакого значения переменной типа string, то будет подразумеваться опять же 0. В смысле терминирующий 0, то есть пустая строка. А почему пустая строка (L""), а не NULL (отсутствие какого-либо буфера у строки)? Да чтобы не нарваться на неприятности при дальнейшем использовании этой переменной. Напоминаю, что входные переменные являются константными по определению и не могут быть изменены внутри программы.
Вот это нормальный понятный ответ )) Главный смысл - не нарваться, я так и предполагал. Но в справку такое undocumented все же стоит занести, а то я нарвался на ожидание NULL, хорошо хоть в простеньком скрипте.
 

Нормальной практикой проверки строки является сначала проверка на NULL (str==NULL), а потом, если не NULL, на пустую строку (str[0]==0)

Видимо поэтому в документации не написано про это undocumented

 
Slawa:

Нормальной практикой проверки строки является сначала проверка на NULL (str==NULL), а потом, если не NULL, на пустую строку (str[0]==0)

Видимо поэтому в документации не написано про это undocumented

Выделено - ценное замечание, не знал.. 

Кстати, сначала хотел спросить, почему обычные глобальные строки не инициализируются "", как input string. Догадываюсь, это из-за экономии памяти? Как устроены строки в MQL изнутри, знают только разработчики, поэтому спрошу. 

Когда я пишу

//объявление глобальной переменной типа строка
string s; // s==NULL

То реально под строку выделяется какая-то память при объявлении без инициализации? То есть строка - это какая-то структура/класс или просто буфер, управляемый рантаймом?

Если буфер, становиться понятно, почему без инициализации строка == NULL. Например, я задаю большой массив, но никак его не использую в силу каких-то причин. Тогда и никакая память не выделяется (или все же на указатели на буфера внутри рантайма?).
 

//глобальный массив строк
sring sarr[1024*1024];