配列の初期化

 

mql4のガイドで配列について学んでいるのですが、困っているトピックに出会いました。配列の初期化が少し不可解です。

"

配列の初期化


配列は、対応する型の定数によってのみ初期化することができます。一次元および多次元配列は、カンマで区切られた一次元の定数列で初期化されます。配列は中括弧で囲まれています。

int Mas_i[3][4] = { 0, 1, 2, 3,   10, 11, 12, 13,   20, 21, 22, 23 };
 
double Mas_d[2][3] = { 0.1, 0.2, -0.3,    -10.2, 1.5, 7.0 };
 
bool Mas_b[5] = { false, true, false, true, true }

"

配列は対応する型の定数によってのみ初期化されるという事実には混乱しないが、配列の初期化の概念と1次元配列が多次元配列を初期化することができるという事実には混乱する。

以下のように混乱しています。

"

初期化されたシーケンスでは、1つまたはいくつかの定数が省略されることがあります。このような場合、数値型の配列要素はゼロで初期化され、文字列型の配列要素は文字列値 "" (引用符、スペースなし)、すなわち空行(スペースと混同しないように)で初期化されます。次のプログラムは、いくつかの値を省略したシーケンスで初期化された配列の値を表示 します(スクリプト arrayalert.mq4

//--------------------------------------------------------------------
// arrayalert.mq4
// The code should be used for educational purpose only.
//--------------------------------------------------------------------
int start()                                     // Special funct. start()
  {
   string Mas_s[4] = {"a","b", ,"d"};           // String array
   int Mas_i[6] = { 0,1,2, ,4,5 };              // Integer type array
   Alert(Mas_s[0],Mas_s[1],Mas_s[2],Mas_s[3]);  // Displaying
   Alert(Mas_i[0],Mas_i[1],Mas_i[2],Mas_i[3],Mas_i[4],Mas_i[5]);
   return;                                      // Exit start()
  }
//--------------------------------------------------------------------

"

結局のところ、私は配列の初期化の概念を理解していないのです。

 

配列の概念を理解していますか? 複数のインデックスを持つ変数ですか?

初期化が行うのは、すべてのインデックスに開始値を設定することだけです。

あなたが投稿した例のように、各インデックスに別々に値を設定することができます。

すべてのインデックスに同じ初期値を設定したい場合は、このように一度だけ値を入力します。

int myarray[100]={0};   //initializes all 100 indexes to value zero

とか。

int myarray[100][5]={-1}; //multi dimensions, initializes all 500 indexes to -1.

また、mql4の本にはいくつか間違いがあるので注意してください。2つ目の例でこう書いてありますね。

「初期化されたシーケンスでは、1つまたはいくつかの定数が省略されることがあります。このような場合、数値型の配列要素は ゼロで初期化され、文字列型の配列要素は文字列値 "" (スペースなしの引用符)、すなわち空行(スペースと混同してはいけません)で初期 化されます。" と書かれているところです。

と言って、このような例を示しています。

string Mas_s[4] = {"a","b", ,"d"};           // String array

という意味だったのでしょう。

string Mas_s[4] = {"a","b","","d"};           // String array
また、この本のどこかに「すべての配列はデフォルトで static 型である」と書かれていますが、これも誤りです。配列は他の変数と同じで、static と定義されていない限り static ではありません。
 
SDC:

配列の概念を理解していますか? 複数のインデックスを持つ変数ですか?

初期化で行うのは、すべてのインデックスに開始値を設定することだけです。

もし、すべてのインデックスに同じ値を設定したい場合は、次のように一度だけ値を入力します。

int myarray[100] {0} //100個のインデックスをすべて値0に初期化します。


まだ少し混乱しています。

では、もし私が配列

Double myarray[100] とします。

私は、配列の型(double)、配列の名前(myarray)とインデックスの数(100)を宣言しました。

配列MyArrayの値は、Double myarray[100] = {1, 2, 3, ...}を使って、myarray[1]=1、myarray[2]=2 などと割り当てることができるのでしょうか?

これまで私はループから値を取得する目的で配列を作ってきましたが、その場合でも配列は非常に緩やかに使用されていました。

ありがとうございます。その間違いを指摘してくれたおかげで、私が抱いていた小さな疑問が解消されました。

 

最初の配列のインデックスが0なので、そうすると

double myarray[100] = {1,2,3 ......} とします。

とすれば、myarray[0] == 1, myarray[1] == 2 などとなります。

 

ああそうか、わかった。

では、多次元のArrayがある場合はどうでしょうか。

Double Myarray[3][4] = {0.1,0.2,0.3,0.4,0.5} とします。(すみません、先ほどは整数を使ったことに気づきました)

値を呼び出すにはどうすればよいのでしょうか?

 

myarray[index,index];のように呼んでも、myarray[index][index];のように呼んでも同じことができます。

val = myarray[2,2]; //配列のインデックス2,2から値を取得し、val.Print(myarray[2,2]);に格納します。

Print(myarray[2,2]); //prints it

Alert(myarray[2][2]); //警告を出す。

 

どのような値になるのでしょうか?

Double Myarray[3][4] = {0.1,0.2,0.3,0.4,0.5} となります。

Myarray[1][3]=?

 
ゼロは、あなたが何も割り当てていないため
 

3×4の配列がある場合

double Myarray[3][4] = {0.1,0.2,0.3,0.4,0.5} ;

とすると、次のように入力されます。

Myarray[0,0] = 0.1;

Myarray[0,1] = 0.2。

Myarray[0,2] = 0.3。

Myarray[0,3] = 0.4。

Myarray[1,0] = 0.5;

Myarray[1,1] = 0.0;

Myarray[1,2] = 0.0。

その他

 
Myarray[3][4]に宣言された値をarray[0,0]が持っているのはなぜですか?
 

私は今、無知です...。

Myarray[3][4]は多次元ではないのですか?もしそうなら、なぜ1つの次元の値を変更することによってのみ値を呼び出すことができるのですか?