О приведении типов

Viktar Dzemikhau  

 Читаю статью Ордерa, позиции и сделки в MetaTrader 5. Там вижу такую строку:

ENUM_ORDER_STATE state=(ENUM_ORDER_STATE)HistoryOrderGetInteger(order_ticket,ORDER_STATE);

 Я так понимаю здесь возвращаемое значение HistoryOrderGetInteger() приводится к типу ENUM. Тока вот подобных вариантов ни в документации, ни где-либо до сегодняшнего момента я не встречал. С чего бы это вдруг?

 Ведь функция HistoryOrderGetInteger() возвращает тип long. А приводить long к ENUM... Это же не совсем корректно. Почему так?

Ордерa, позиции и сделки в MetaTrader 5
Ордерa, позиции и сделки в MetaTrader 5
  • 2011.01.05
  • MetaQuotes Software Corp.
  • www.mql5.com
Надежный торговый робот не может быть создан без понимания механизмов работы торговой системы MetaTrader 5. Клиентский терминал получает от торгового сервера информацию о позициях, ордерах и сделках. Чтобы правильно обработать эти данные средствами MQL5 необходимо хорошо представлять как происходит взаимодействие mql5-программы и среды исполнения терминала.
Mykola Demko  
hoz:

 Читаю статью Ордерa, позиции и сделки в MetaTrader 5. Там вижу такую строку:

 Я так понимаю здесь возвращаемое значение HistoryOrderGetInteger() приводится к типу ENUM. Тока вот подобных вариантов ни в документации, ни где-либо до сегодняшнего момента я не встречал. С чего бы это вдруг?

 Ведь функция HistoryOrderGetInteger() возвращает тип long. А приводить long к ENUM... Это же не совсем корректно. Почему так?

В данном случае тип функции определяет максимальную ширину канала данных которые могут быть возвращены. В зависимости от модификатора функция возвращает разные данные в том числе и тикеты.

В конкретном же Энумероторе явно описываются все варианты значений для данного модификатора.

Так что всё нормально, для модификатора ORDER_STATE тип возвращаемого значения  ENUM_ORDER_STATE как раз и создан чтоб не запутаться при передаче через универсальный порт.

Viktar Dzemikhau  
Urain:

В данном случае тип функции определяет максимальную ширину канала данных которые могут быть возвращены. В зависимости от модификатора функция возвращает разные данные в том числе и тикеты.

В конкретном же Энумероторе явно описываются все варианты значений для данного модификатора.

Так что всё нормально, для модификатора ORDER_STATE тип возвращаемого значения  ENUM_ORDER_STATE как раз и создан чтоб не запутаться при передаче через универсальный порт.

Так это всё-таки приведение типа или не совсем так? Я как-то не очень понял Ваше изложение...
Mykola Demko  
hoz:
Так это всё-таки приведение типа или не совсем так? Я как-то не очень понял Ваше изложение...

Не совсем так. Внутреннее представление enum само по себе есть long, поэтому как такового приведения типов не происходит.

Это просто дополнительная возможность внутреннего контроля самого программиста.

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

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

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

Eugeniy Lugovoy  

Я бы сказал что такое приведение делается эстетики для.

Mykola Demko  
elugovoy:

Я бы сказал что такое приведение делается эстетики для.

:)

Конкретно в статье это было сделано по требованию модератора принимавшего статью. 

Нельзя сдавать статью если компилятор выдаёт предупреждения. 

Alexey Volchanskiy  
Urain:

:)

Конкретно в статье это было сделано по требованию модератора принимавшего статью. 

Нельзя сдавать статью если компилятор выдаёт предупреждения. 

И это правильно. В любой программерской фирме (а я много в каких работал) не принимают релиз проекта, если есть варнинги. И по форексу меня спасло раз от серьезной ошибки - две переменные имели почти одинаковые имена и я написал одно вместо другого. Если бы компилятор не выдал предупреждение, произошла бы серьезная ошибка. А от ошибок никто не застрахован.
Vasiliy Sokolov  
hoz:
Так это всё-таки приведение типа или не совсем так? Я как-то не очень понял Ваше изложение...

Да, это приведение типа. Приведения делятся на явные и неявные. В случае когда требуется привести меньший тип к большому приведение типов работает "за кулисами" и явно указывать тип приведения не нужно:

int small = 1;
long big = small;

Этот код скомпилируется без ошибок и предупреждений. Однако обратное не верно, код:

long big = 1;
int small = big;

Вызовет предупреждение:

possible loss of data due to type conversion Test.mq5 12 10

 Потому что делается явная попытка привести меньший тип к большему. Для того что бы это избежать используйте явное приведение:

long big = 1;
int small = (int)big;

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

Явное приведение к типу enum всегда необходимо, т.к. enum - по сути специальный, 4 байтовый, строгий тип, принимающий строго определенные значения. Enum используется в том числе для контроля типов, где строгое приведение критично важное свойство.