Обсуждение статьи "Расширенные переменные и типы данных в MQL5"

 

Опубликована статья Расширенные переменные и типы данных в MQL5:

Переменные и типы данных — очень важные темы не только в программировании на MQL5, но и в любом языке программирования. Переменные и типы данных MQL5 можно разделить на простые и расширенные. Здесь мы рассмотрим расширенные переменные и типы данных. Простые мы изучали в предыдущей статье.

В этой статье мы рассмотрим новые переменные и типы данных в MQL5, а также их применение при разработке торгового программного обеспечения MQL5. Мы узнаем больше о некоторых продвинутых концепциях переменных и типов данных и рассмотрим их в следующих темах:


    Автор: Mohamed Abdelmaaboud

     
    MetaQuotes:

    Ознакомьтесь с новой статьей: Расширенные переменные и типы данных в MQL5.

    Автор: Мохамед Абдельмаабуд


    Я в некоторой степени не согласен с тем, что директива препроцессора может быть упомянута в контексте переменных const.

    Ключевое слово const имеет другой эффект, чем #define "константа".

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

    В отличие от переменной const, оператор #define представляет собой так называемое r-значение, которое фактически находится в области памяти только для чтения в дальнейшем исполняемом двоичном файле, и поэтому фактически не может быть изменено каким-либо образом.

    Кроме того, #define - это директива стадии препроцессора, и на самом деле она просто заменяет все вхождения в исходный файл. Это делается еще до того, как компилятор увидит компилируемый код.

    Кроме того, директива #define не имеет такого "местоположения", как глобальная, она может появиться в любом месте исходного файла. На этапе препроцессора понятие кодовых блоков "{...}" не доступно и не оценивается.

    Видимость переменных определяется кодовыми блоками. Вы можете на любом уровне определять кодовые блоки как угодно, кроме глобального уровня. На глобальном уровне вам нужна некоторая "сущность", к которой принадлежит этот блок. Функция, класс, структура или пространство имен.

    Внутри такого "именованного" блока вы можете каскадировать сколько угодно блоков, при этом видимость всегда будет только внутри блоков того же уровня или включенных/дочерних блоков.

    статические переменные фактически находятся в глобальном пространстве памяти, выделенном для программы, видимость этой переменной определяется блоком кода, в котором она была объявлена/определена. Это может быть и глобальное пространство. На самом деле, переменная, объявленная/определенная в глобальном пространстве, имеет неявное ключевое слово "static". Его явное упоминание никак не изменит поведение этой переменной.

    В вашей статье мне не хватает ключевого слова "extern", а также "input". Я думаю, они должны быть частью статьи.

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

    Возможно, вы продолжите статью, было бы неплохо, если бы вы рассказали об определении, объявлении и инициализации переменных, а также о памяти. Возможно, вы также укажете на подводные камни, если сделать это неправильно.

    И для большего понимания, возможно, некоторые расширенные детали о стеке, порядок переменных, MSB против LSB, адресация памяти..... Ладно, может быть, это слишком далеко.
     
    Dominik Egert #:

    Я в некоторой степени не согласен с тем, что директива препроцессора может быть упомянута в контексте переменных const.

    Ключевое слово const имеет другой эффект, чем #define "константа".

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

    В отличие от переменной const, оператор #define представляет собой так называемое r-значение, которое фактически находится в области памяти только для чтения в дальнейшем исполняемом двоичном файле, и поэтому фактически не может быть изменено каким-либо образом.

    Кроме того, #define - это директива стадии препроцессора, и на самом деле она просто заменяет все вхождения в исходный файл. Это делается еще до того, как компилятор увидит компилируемый код.

    Кроме того, директива #define не имеет такого "местоположения", как глобальная, она может появиться в любом месте исходного файла. На этапе препроцессора понятие кодовых блоков "{...}" не доступно и не оценивается.

    Видимость переменных определяется кодовыми блоками. Вы можете на любом уровне определять кодовые блоки как угодно, кроме глобального уровня. На глобальном уровне вам нужна некоторая "сущность", к которой принадлежит этот блок. Функция, класс, структура или пространство имен.

    Внутри такого "именованного" блока вы можете каскадировать сколько угодно блоков, при этом видимость всегда будет только внутри блоков того же уровня или включенных/дочерних блоков.

    статические переменные фактически находятся в глобальном пространстве памяти, выделенном для программы, видимость этой переменной определяется блоком кода, в котором она была объявлена/определена. Это может быть и глобальное пространство. На самом деле, переменная, объявленная/определенная в глобальном пространстве, имеет неявное ключевое слово "static". Его явное упоминание никак не изменит поведение этой переменной.

    В вашей статье мне не хватает ключевого слова "extern", а также "input". Я думаю, они должны быть частью статьи.

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

    Возможно, вы продолжите статью, было бы неплохо, если бы вы рассказали об определении, объявлении и инициализации переменных, а также о памяти. Возможно, вы также укажете на подводные камни, если сделать это неправильно.

    И для большего понимания, возможно, некоторые расширенные детали о стеке, порядок переменных, MSB против LSB, адресация памяти..... Ладно, может быть, это слишком далеко.


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

     
    Dominik Egert #:
    Ключевое слово const действует иначе, чем #define "constant".

    Кстати, мне нравится, как реализованы константы в C# (компилятор заменяет их на литеральные значения).

    https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/constants

    На самом деле, когда компилятор встречает идентификатор константы в исходном коде C#, он подставляет буквенное значение непосредственно в код промежуточного языка (IL), который он производит. Поскольку во время выполнения с константой не ассоциируется адрес переменной, const-поля не могут передаваться по ссылке и не могут выступать в качестве l-значения в выражении.

    Судя по тому, что в MQL я могу передавать константу по ссылке, в MQL константы остаются переменными после компиляции.