記事「MQL5の高度な変数とデータ型」についてのディスカッション

 

新しい記事「MQL5の高度な変数とデータ型」はパブリッシュされました:

変数とデータ型は、MQL5プログラミングだけでなく、どのプログラミング言語でも非常に重要なトピックです。MQL5の変数とデータ型は、単純なものと高度なものに分類できます。単純なものについては前回の記事ですでに述べたので、今回は高度なものを特定し、それについて学ぶことにします。

変数とデータ型は、MQL5プログラミングだけでなく、どのプログラミング言語でも非常に重要なトピックです。MQL5の変数とデータ型は、単純なものと高度なものに分類できます。単純なものについては前回の記事ですでに述べたので、今回は高度なものを特定し、それについて学ぶことにします。

この記事では、MQL5における変数とデータ型について、そしてそれらがMQL5取引ソフトウェアを作成または構築する際にどのように役立つのかについて、言及し、さらに深く学んでいきます。変数とデータ型に関するいくつかの高度な概念について、以下のトピックを通して学びます。

  • 定数 変わらない値を持つ識別子
  • 配列 複数の値を持つあらゆる型の変数 
  • 列挙体:整数値を持つ定数の整数リスト
  • 構造体:異なる型を持つ関連変数の集合
  • 型キャスト:ある型の値を別の型に変換すること
  • ローカル変数:関数の内部でローカルに宣言された変数
  • グローバル変数:関数の外でグローバルに宣言された変数
  • 静的変数:メモリー内に値を保持する、宣言されたローカル変数
  • 定義済み変数:プログラミング言語の起草者によって定義された変数


作者: Mohamed Abdelmaaboud

 
MetaQuotes:

新しい記事をご覧ください:MQL5の高度な変数とデータ型

著者モハメド・アブデルマブード


プリプロセッサ・ディレクティブがconst変数の文脈で言及されることに、私はある程度同意できない。

キーワードconstは、#define "定数 "とは異なる効果を持つ。

constは関数のシグネチャで非常に有用で、パラメータ値を読み込み専用モードに設定する。コンパイラが生成する実行バイナリには、そのような表現はありません。

const変数とは対照的に、#define文はいわゆるr値であり、実行バイナリの後の方で読み取り専用のメモリ領域にあるため、実際には一切変更できません。

また、#defineはプリプロセッサ段階のディレクティブであり、実際にはソースファイル内のすべてのディレクティブを置き換えるだけである。これは、コンパイラがコンパイルされるコードを見る前に行われます。

さらに、#defineディレクティブにはグローバルという「場所」はなく、ソースファイルのどこに出現してもよい。プリプロセッサの段階では、コードブロック「{...}」の概念は利用できないし、評価もされない。

変数の可視性は、コードブロックによって定義されます。グローバル・レベルを除いて、どのレベルでも好きなようにコードブロックを定義することができます。グローバル・レベルでは、このブロックが属する「エンティティ」が必要です。関数、クラス、構造体、名前空間などです。

このような "名前付き "ブロックの内部では、好きなだけブロックをカスケードすることができます。

静的変数は、実際にはプログラムに割り当てられたグローバル空間のメモリに存在し、この変数の可視性は、その変数が宣言/定義されたコードブロックによって管理されます。これはグローバル空間でもあります。実際、グローバル空間で宣言/定義された変数には、暗黙の "static "キーワードがあります。このキーワードを明示的に指定しても、その変数の動作は何も変わりません。

あなたの記事には、"input "だけでなく、"extern "というキーワードがありません。これらは一部であるべきだと思います。

とにかく、特に初心者の方にとっては良い記事だと思います。変数の概念は最初のうちは理解しにくいこともありますし、適切に実装すれば多くのエラーを避けることができます。

変数の定義、宣言、初期化、メモリについても書いてもらえるとうれしいです。正しく行われなかった場合の落とし穴も指摘してほしい。

さらに、スタック、変数の順序、MSBとLSBの違い、メモリ・アドレッシング......などについて、もう少し詳しく説明してほしい。OK、これはあまりに遠回りかもしれない。
 
Dominik Egert #:

プリプロセッサ指令がconst変数の文脈で言及されることには、いささか同意しかねる。

constキーワードは#define "constant "とは異なる効果を持つ。

constは、パラメータの値を読み取り専用にするため、関数のシグネチャで非常に便利です。constはコーダーのために特別に作られたキーワードです。コンパイラが作成する実行バイナリには、このキーワードは存在しません。

const変数とは異なり、#define演算子はいわゆるr値を表しますが、これは実際にはさらなる実行バイナリの読み取り専用メモリ・ロケーションに配置されるため、実際にはどのように変更することもできません。

また、#defineはプリプロセッサ段階の指示子であり、実際にはソース・ファイル内のすべての出現箇所を置き換えるだけである。これはコンパイラがコンパイルされたコードを見る前に行われます。

また、#defineディレクティブはグローバル・ディレクティブのような「場所」を持たないので、ソース・ファイルのどこに出現してもかまいません。プリプロセッサの段階では、"{...}"コードブロックの概念は利用できませんし、評価もされません。

変数の可視性は、コードブロックによって決まります。グローバル・レベルを除いて、どのレベルでも好きなようにコードブロックを定義できます。グローバル・レベルでは、ブロックが属する「エンティティ」が必要です。関数、クラス、構造体、名前空間などです。

このような「名前付き」ブロックの中では、好きなだけブロックをカスケードすることができます。

静的変数は、実際にはプログラムのために割り当てられたグローバル・メモリ空間に存在し、この変数の可視性は、それが宣言/定義されたコードブロックによって決定されます。これはグローバル空間でもあり得ます。実際、グローバル空間で宣言/定義された変数には、暗黙のキーワード "static "があります。このキーワードを明示的に指定しても、この変数の動作が変わることはありません。

あなたの記事には、"input "だけでなく "extern "というキーワードもありません。これらは記事の一部であるべきだと思います。

というのも、変数の概念は最初のうちは理解しにくいことがあり、正しく実装すれば多くの間違いを避けることができるからです。

変数の定義、宣言、初期化、そしてメモリについても話してもらえるとうれしいです。おそらく、間違った方法で実行した場合の落とし穴も指摘してくれるでしょう。

さらに理解を深めるために、スタック、変数の並び順、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ではコンパイル後も定数は変数のままです。