Обсуждение статьи "Изучение MQL5 — от новичка до профи (Часть II): Базовые типы данных и использование переменных" - страница 2

 
Oleh Fedorov #:

Кхм... Стесняюсь спросить, но придется...

  • А насколько часто такие конструкции встречаются в реальном коде MQL5?
  • "Джунское собеседование"... Значит ли это, что лично Вы встречались с большими конторами, одним из основных направлений у которых является MQL? (Лично мне до сих пор не приходилось).
  • А во всех ли с-подобных языках этот код выдаст одинаковые результаты?

Короче, а нафига неофиту настолько глубокое понимание литералов?


P.S. Я лично, хоть и далеко не неофит, провалил Ваш тест, ни на один вопрос правильно не ответив. В учебниках что-то похожее вроде встречал - то ли в Java, то ли в PHP - но это было так давно, и настолько не соответствует практическому коду, который приходилось читать или писать до сего дня... Не быть мне джуном в Вашей конторе. И... что?

P.P.S. Думаю, что если Вы напишете статью о литералах, она может оказаться полезной не только мне. ;-) Особенно если Вы поделитесь опытом, которого нет в справке... Правда, недокументированные возможности меня обычно ну очень сильно смущают, ибо слишком часто внезапно меняются в новых версиях, но, мало ли... Вдруг это будет действительно важно или хотя бы полезно?

Понимаешь. Вопрос не в том, как часто встречается, а в том, что люди не знают и не хотят знать тонкости. А про приведение типов, это нужно знать, так как это основа основ. Через это столько боли получается. Кстати, вот такой код, это не про приведение типов, а на задуматься:

 

enum E{
   int a;
   float b;
}

double F(E& e, int a){
   e.a = a;
   return e.b;
}

Так вот, исходя из справки тут все нормально. Только, лично для меня, есть НЮАНС. По утверждениям разработчиков, mql писан на С++, а в C++ так нельзя, это UB, а вот в С все законно. Подобный код на плюсах я видел часто, и да он работал и работает, но, лично мне как-то стремно так писать, а вот стремно ли разработчикам mql, я не знаю. Поэтому я так никогда в mql делать не буду, потому, что реализацию не знаю.

 
Vladimir Simakov #:


По утверждениям разработчиков, mql писан на С++, а в C++ так нельзя, это UB, а вот в С все законно.

Прошу, таки, прощения, но разработчики утверждают, что язык программирования MQL максимально близок к С++, а не написан на нём. ))

С уважением, Владимир.

 
Vladimir Simakov #:
А про приведение типов, это нужно знать, так как это основа основ.

И даже пытаться спорить не буду. Вот абсолютно согласен. Просто... Ну, не все конструкции C одинаково полезны в MQL! :-)

По поводу кода "на задуматься"... Поскольку именно с C (обоими) я на "вы", для меня этот код вообще выглядит дичью. В справке тип enum отнесён к целым типам, и я вообще даже не думал, что он является структурой. Его смысл ведь совсем другой... Но спасибо, теперь буду знать - хотя толку с этого знания для меня лично вот вообще нет, не буду я такое использовать :-).

Так вот, исходя из справки тут все нормально.

А можно ссылочку?

Документация по MQL5: Основы языка / Типы данных / Целые типы / Перечисления
Документация по MQL5: Основы языка / Типы данных / Целые типы / Перечисления
  • www.mql5.com
Данные перечислимого типа enum относятся к некоторому ограниченному множеству данных. Определение перечислимого типа: Список значений представляет...
 
Oleh Fedorov #:

По поводу кода "на задуматься"... Поскольку именно с C (обоими) я на "вы", для меня этот код вообще выглядит дичью. В справке тип enum отнесён к целым типам, и я вообще даже не думал, что он является структурой. Его смысл ведь совсем другой... Но спасибо, теперь буду знать - хотя толку с этого знания для меня лично вот вообще нет, не буду я такое использовать :-).

Это и есть дичь. Человек, видимо, писал с потолка и перепутал enum и union. Его пример не компилируется. Enum - это никакая не структура, а 4-х байтовое целое. Если брать union, то это прекрасно работает и в C++, и в MQL.

PS. По поводу первого примера из джунского собеседования и вопроса, насколько часто такое встречается - разумеется в чистом виде такое не встречается, т.к. пример рафинированный, но очень часто в коде вперемешку используются знаковые и беззнаковые целые, и тут проблемы вполне вероятны.
 
Stanislav Korotky #:

Это и есть дичь. Человек, видимо, писал с потолка и перепутал enum и union. Его пример не компилируется. Enum - это никакая не структура, а 4-х байтовое целое. Если брать union, то это прекрасно работает и в C++, и в MQL.

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

Естественно union)))

Насчет остального: https://en.cppreference.com/w/cpp/language/union

It is undefined behavior to read from the member of the union that wasn't most recently written. 

И да, я знаю, что дальше написано

Many compilers implement, as a non-standard language extension, the ability to read inactive members of a union.

Вот только, msvs, из справки которой это взято, не утверждает второе, хотя, вроде как и не нарывался пока никто. g++ и clang не смотрел, что по этому поводу говорят, но вряд ли другое.

Если хотите так юзать, юзайте - это ваше право и ваша боль, случись что))). 

 
Vladimir Simakov #:

Естественно union)))

Насчет остального: https://en.cppreference.com/w/cpp/language/union

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

Accessing inactive union member and undefined behavior?
Accessing inactive union member and undefined behavior?
  • 2012.07.07
  • Luchian Grigore Luchian Grigore 257k 66 66 gold badges 461 461 silver badges 626 626 bronze badges
  • stackoverflow.com
I was under the impression that accessing a member other than the last one set is UB, but I can't seem to find a solid reference (other than answers claiming it's UB but without any support from the standard). So, is it undefined behavior?
 
Stanislav Korotky #:

Это и есть дичь. Человек, видимо, писал с потолка и перепутал enum и union. Его пример не компилируется. Enum - это никакая не структура, а 4-х байтовое целое. Если брать union, то это прекрасно работает и в C++, и в MQL.

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

Фух, картина мира восстановлена! :-) Про объединения и остальные сложные типы я как раз заканчиваю (надеюсь, если не будет очередных ляпов, должна выйти  уже на следующей неделе).

P.S. MetaEditor не подсвечивает литералы с суффиксами `u` и  `ull`, однако компилирует их. При этом подсвечивает `f`, но сообщает об ошибке... Интересно, это баг или намёк? :-)

 

Если вы - новичок и запутались в наших прениях, поясню, что в языке C (а также - C++) к цифровым литералам можно добавлять суффиксы, которые меняют тип данных. Например, суффикс `u` превращает обычное целое число (int) в беззнаковое (uint).

Попробуйте выполнить чуть изменённый скрипт, который предложил Vladimir Simakov (обратите внимание на отсутствие пробелов между цифрами и буквами, это важно):

void OnStart()
  {
//---
    
   Print(typename(1));
   Print(typename(-1));
   Print(typename(1ll));
   
   Print(typename(1u));
   Print(typename(1ull));
   
   Print(typename(-1*1ull));
   
   Print(typename(NULL));
   
   
   Print(-1<1u); 
   Print(-1*1ull);
  }

Этот скрипт в первых строках выводит имена типов некоторых литералов, которые компилируются в языке MQL5.

Может, я собрал и не все работающие суффиксы, надеюсь, специалисты C меня поправят. Просто попробуйте понять логику - исходя из материала статьи, выдачи скрипта и нашей дискуссии, а если всё совсем непонятно - задавайте вопросы.

Обсуждение статьи "Изучение MQL5 — от новичка до профи (Часть II): Базовые типы данных и использование переменных"
Обсуждение статьи "Изучение MQL5 — от новичка до профи (Часть II): Базовые типы данных и использование переменных"
  • 2024.06.11
  • Vladimir Simakov
  • www.mql5.com
Опубликована статья Изучение MQL5 — от новичка до профи (Часть II): Базовые типы данных и использование переменных : Автор: Oleh Fedorov...