Что такое тип string? - страница 2

 

Да, интересный вопрос. В Справочнике полуторагодовой давности нашёл вот такой абзац:

"При смене символа или ТФ графика, к которому прикреплён эксперт, выгрузка и загрузка эксперта не производится. При этом последовательно вызываются обработчики OnDeinit() на старом символе/ТФ и OnInit() на новом символе/ТФ (если они есть), значения  глобальных  переменных и статических переменных не сбрасываются". Если под "глобальными переменными" подразумеваются переменные, объявленные на глобальном уровне программы, то в примере они не только "сбрасываются", но и выдают разные значения у разных пользователей.

Документация по MQL5: Основы языка / Переменные / Статические переменные
Документация по MQL5: Основы языка / Переменные / Статические переменные
  • www.mql5.com
Основы языка / Переменные / Статические переменные - Документация по MQL5
 
may:
Попробую к разработчикам обратиться. Может это просто баг.
Спасибо за сообщение. Разбираемся.
 
antt:
Спасибо за сообщение. Разбираемся.

Спасибо!

Может быть еще ссылками на более подробное описание типа string поможете? А то я с языком C++ лет уж 12 как не сталкивался, MQL первую неделю вижу, да и вообще уже лет 6 не пишу. И потом мне не очевидно, что string в Borland Builder и string MQL - это одно и то же. Хочется понимать, чем оперируешь...

Сама по себе проблема у меня возникла из-за того, что мне нужно в эксперте разделить обработку смены символа и смены периода (жаль, что для этих событий в DeInit приходит один и тот же параметр). Поэтому мне нужно запомнить начальный символ и возвращать его значение каждый раз, когда пользователь пытается символ сменить (тут тоже хотелось бы иметь у графика свойство типа AllowSymbolChange и AllowPeriodChange)

Документация по MQL5: Основы языка / Типы данных / Тип string
Документация по MQL5: Основы языка / Типы данных / Тип string
  • www.mql5.com
Основы языка / Типы данных / Тип string - Документация по MQL5
 
papaklass:

Так и должно быть. Справка:

Возвращает имя символа текущего графика.

string  Symbol();

Возвращаемое значение

Значение системной переменной _Symbol, в которой хранится имя символа текущего графика.

Вы присваиваете переменной WorkSymbol значение функции Symbol().

Вот если бы Вы своей переменной присвоили значение так WorkSymbol = "EURUSD" , то при смене графика значение Вашей переменной не поменялось бы.

Такое объяснение вряд ли проясняет ситуацию с тем, что под Вистой приведенный мной код работает не так, как под XP. У меня есть 2 предположения, почему происходит так, как происходит. 1 - тип string суть всего лишь указатель и оператор "=" для него просто настраивает этот указатель на участок памяти, определенный правым аргументом оператора. Но что-то подсказывает мне, что это не так и для типа string существует диспетчер памяти, который управляет всей этой суетой с указателями, когда надо - выделяет память и копирует данные, когда не надо - пользуется одной и той же областью, при необходимости - освобождает память и выполняет прочие полезные вещи. Вот этот диспетчер, кажется, в моем случае отрабатывает неправильно. Он бы должен был выделить необходимое кол-во памяти для переменной WorkSymbol и скопировать туда содержимое _Symbol (или результат Symbol()). И после этого содержимое переменной WorkSymbol меняться уже не должно до тех пор, пока эксперт не будет перегружен по полной программе (с переинициализацией переменных)
 
may:
Такое объяснение вряд ли проясняет ситуацию с тем, что под Вистой приведенный мной код работает не так, как под XP. У меня есть 2 предположения, почему происходит так, как происходит. 1 - тип string суть всего лишь указатель и оператор "=" для него просто настраивает этот указатель на участок памяти, определенный правым аргументом оператора. Но что-то подсказывает мне, что это не так и для типа string существует диспетчер памяти, который управляет всей этой суетой с указателями, когда надо - выделяет память и копирует данные, когда не надо - пользуется одной и той же областью, при необходимости - освобождает память и выполняет прочие полезные вещи. Вот этот диспетчер, кажется, в моем случае отрабатывает неправильно. Он бы должен был выделить необходимое кол-во памяти для переменной WorkSymbol и скопировать туда содержимое _Symbol (или результат Symbol()). И после этого содержимое переменной WorkSymbol меняться уже не должно до тех пор, пока эксперт не будет перегружен по полной программе (с переинициализацией переменных)
Да всё проще, мне кажется. Просто в данном случае оптимизатор что-то "переоптимизировал". Забавно, что я с подобной штукой уже сталкивался пару лет назад (на МТ5), вроде разработчики починили. Возможно глюк вернулся на место.  Щас поищу где это было.
 
papaklass:

Так и должно быть. Вы присваиваете переменной WorkSymbol значение функции Symbol().

Так не должно быть (С) :)

Посмотрите внимательнее код: значение функции Symbol() присваивается переменной WorkSymbol не просто так, а при выполнении определённого условия.

...Запустил дома проверочный код; результаты аналогичны результатам may. Win7(64). Новый символ распечатывается как до проверки этого условия, так и после. Как такое может быть, если условие выглядит следующим образом:

if (WorkSymbol == "") WorkSymbol = Symbol();
?
 

Вопрос по размеру памяти для типа string.

В MQL4 длина строковой константы составляет от 0 до 255 символов.

В MQL5 разработчик не указывает допустимую длину, если не ошибаюсь...

Из справки объём памяти тип string забирает в 12 байт. Но длина строки, как попробовал, может быть большой. Где ограничение?

Документация по MQL5: Основы языка / Типы данных / Тип string
Документация по MQL5: Основы языка / Типы данных / Тип string
  • www.mql5.com
Основы языка / Типы данных / Тип string - Документация по MQL5
 

Объявлять переменные вверху.

Обнулять в OnInit. 

 
papaklass:
 Когда меняется график, то эксперт выгружается, т.е. все его переменные уничтожаются. И происходит новая инициализация эксперта. Посмотрите первую строчку кода в первом посту темы. Поэтому условие в OnInit() будет выполняться всегда. Берите свои слова обратно.      
Вы бы ещё через год претензии предъявили :) Если я когда-то высказал определённую мысль - значит, проверил её и был уверен. В очередной раз проверять Ваши доводы спустя столько времени уже не интересно.
Причина обращения: