![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Вероятно, в мкл стринг это не ссылочный тип данных, а примитив, поэтому он не нулл, а пустая строка.
Не удивлюсь что возможно здесь можно стринговые переменные сравнивать напрямую через == на равенство значений, а не ссылок.
Думаю легче запомнить эти фичи, и иметь это ввиду.
Все таки это прикладной мкл...
плохо читаете.
Input это как минимум не extern . Он ближе к #define
и тем более не глобальная переменная
---
вы лучше попробуйте в коде задать этому input другое значение, например в OnInit.
Будете удивлены наверно
Вы меня за лоха-малолетку держите? ))) Написал же в третьем посте
"Input string - глобальная константная переменная и должна инициализироваться как NULL, если пользователь не задал значение."
Ни к каким дефайнам переменные с модификатором input отношения не имеют, так как имеют заданный тип. Насчет глобальности даже говорить не буду - основы.
Вероятно, в мкл стринг это не ссылочный тип данных, а примитив, поэтому он не нулл, а пустая строка.
Не удивлюсь что возможно здесь можно стринговые переменные сравнивать напрямую через == на равенство значений, а не ссылок.
Думаю легче запомнить эти фичи, и иметь это ввиду.
Все таки это прикладной мкл...
Вероятно, в мкл стринг это не ссылочный тип данных, а примитив, поэтому он не нулл, а пустая строка.
Не удивлюсь что возможно здесь можно стринговые переменные сравнивать напрямую через == на равенство значений, а не ссылок.
Думаю легче запомнить эти фичи, и иметь это ввиду.
Все таки это прикладной мкл...
Вы меня за лоха-малолетку держите? ))) Написал же в третьем посте
"Input string - глобальная константная переменная и должна инициализироваться как NULL, если пользователь не задал значение."
вы написали то как вам хочется, придали какой то понятный вам смысл,
а не то как есть на самом деле https://www.mql5.com/ru/docs/basis/variables/inputvariables
--
И в С++ никакие NULL вам не должны задаваться априори.
Все ясно, пишу в СД..
А смысл? Чем Вам мешает пустая строка?
Входные переменные привязаны к полям в форме.
Если Вы не задали никакого значения переменной типа int, то будет подразумеваться значение 0
Если Вы не задали никакого значения переменной типа bool, то будет подразумеваться значение false (то есть опять же 0).
Если Вы не задали никакого значения переменной типа string, то будет подразумеваться опять же 0. В смысле терминирующий 0, то есть пустая строка. А почему пустая строка (L""), а не NULL (отсутствие какого-либо буфера у строки)? Да чтобы не нарваться на неприятности при дальнейшем использовании этой переменной. Напоминаю, что входные переменные являются константными по определению и не могут быть изменены внутри программы.вы написали то как вам хочется, придали какой то понятный вам смысл,
а не то как есть на самом деле https://www.mql5.com/ru/docs/basis/variables/inputvariables
--
И в С++ никакие NULL вам не должны задаваться априори.
Мы говорим о MQL5. Будьте добры, посмотрите скриншот в первом посте, там ясно видно под отладчиком, что глобальная неинициализированная переменная string strGlobal имеет значения NULL при старте скрипта.
А в приведенной вам ссылке на раздел справки черным по белому написано "Изменять значения input-переменных может только пользователь из окна свойств программы." А тут получается, меняет рантайм.
Все, я этот разговор заканчиваю ввиду полной бесполезности.
А смысл? Чем Вам мешает пустая строка?
Входные переменные привязаны к полям в форме.
Если Вы не задали никакого значения переменной типа int, то будет подразумеваться значение 0
Если Вы не задали никакого значения переменной типа bool, то будет подразумеваться значение false (то есть опять же 0).
Если Вы не задали никакого значения переменной типа string, то будет подразумеваться опять же 0. В смысле терминирующий 0, то есть пустая строка. А почему пустая строка (L""), а не NULL (отсутствие какого-либо буфера у строки)? Да чтобы не нарваться на неприятности при дальнейшем использовании этой переменной. Напоминаю, что входные переменные являются константными по определению и не могут быть изменены внутри программы.Нормальной практикой проверки строки является сначала проверка на NULL (str==NULL), а потом, если не NULL, на пустую строку (str[0]==0)
Видимо поэтому в документации не написано про это undocumented
Нормальной практикой проверки строки является сначала проверка на NULL (str==NULL), а потом, если не NULL, на пустую строку (str[0]==0)
Видимо поэтому в документации не написано про это undocumented
Выделено - ценное замечание, не знал..
Кстати, сначала хотел спросить, почему обычные глобальные строки не инициализируются "", как input string. Догадываюсь, это из-за экономии памяти? Как устроены строки в MQL изнутри, знают только разработчики, поэтому спрошу.
Когда я пишу
string s; // s==NULL
То реально под строку выделяется какая-то память при объявлении без инициализации? То есть строка - это какая-то структура/класс или просто буфер, управляемый рантаймом?
Если буфер, становиться понятно, почему без инициализации строка == NULL. Например, я задаю большой массив, но никак его не использую в силу каких-то причин. Тогда и никакая память не выделяется (или все же на указатели на буфера внутри рантайма?).
sring sarr[1024*1024];