配列③ (dim,ddim,sdimの違い) 『HSP3』


配列①(一次元配列 )での例では、「dim」「ddim」「sdim」の違いはあまりみられませんでした。3つとも「整数」「実数」「文字」を代入することができます。よく、「dim」は整数型、「ddim」は実数型、「sdim」は文字型と書かれていますが、なぜそのように書かれているのがみていきます。

 
1.
2.
3.
4.
【例1】
dim arr ,3
repeat 3
    mes arr(cnt)      
loop
  【結果】
0
0
0

【例1】では「dim」で配列を指定しています。1行目で「arr」という配列名で3つ分の要素を準備しています。実はこの時点で、各要素分のメモリを確保し「0」という値をデフォルト値として代入しているのです。3行目で配列要素を表示しています。結果は全て「0」です。3つの要素に「0」の値が代入されていることがわかります。「0」は整数ですので「dim」はデフォルトは整数であることがわかります。

 
1.
2.
3.
4.
【例2】
dim arr ,3
repeat 3
    mes arr(cnt)      
loop
  【結果】
0.000000
0.000000
0.000000

【例2】は【例1】の「dim」を「ddim」に変更しただけです。「ddim」に変更した結果、表示が「0.000000」になっています。「ddim」は配列を指定した時点で、各要素に「0.000000」を代入することがわかります。「0.000000」は実数ですので「ddim」はデフォルトは実数であることがわかります。

 
1.
2.
3.
4.
【例3】
sdim arr ,3
repeat 3
    mes arr(cnt)      
loop
  【結果】
Error
「配列の要素が無効です」

【例3】は【例1】の「dim」を「sdim」に変更しただけです。「sdim」はエラーになりました。「sdim」のみパラメータの意味が違ってきてます。「dim」「ddim」「sdim」のパラメータをまとめてみました。

dim p1,p2
  p1: 配列名
  p2: 配列要素数
ddim p1,p2
p1: 配列名
p2: 配列要素数
sdim p1,p2,p3
p1: 配列名
p2: 要素のバイト数
p3: 配列要素数

「sdim」では第2パラメータに各要素の確保バイト数を指定します。そして第3パラメータに要素数の指定がきます。「dim a,64,3」ならば「a」という配列名で、各要素が64バイトのバッファー領域で要素数3つということになります。第2パラメータでバイト指定していますが、もしオーバーしても自動的に拡張してエラーにならないみたいです。しかし少ない場合は、少ないからといって確保領域は減りません。指定したバッファー領域は最低確保されます。自動拡張といっても、バッファー領域が散ってしまってアクセスに余計な時間使うことにもなるので、なるべくまとまった領域を確保しておく方がいいです。あまり多く取りすぎると使わない領域が増えて無駄になるのでしっかりプログラムにあった領域が望ましいです。
上記でみてきたように、、「dim」は整数型、「ddim」は実数型、「sdim」は文字型に使うというのは正しいようです。ではなぜ3種類とも違う型でエラーにならなかったのかみていきます。

 
1.
2.
3.
4.
【例4】
dim arr ,3
arr(1) = 1.1;
arr(2) = 1.2;
repeat 3
    mes arr(cnt)      
loop
  【結果】
Error 31 in line 2
異なる型を持つ配列変数に代入しました。

 【例4】では「line2」つまり2行目でエラーになりました。「dim」指定ですので、arr(0) にデフォルトで「0」である整数があるのに、2行目でarr(1)に「1.1」という実数を代入しようとして型が違うとエラーになっています。

 
1.
2.
3.
4.
【例5】
dim arr ,3
arr(0) = 1.1;
arr(1) = 1;
repeat 3
    mes arr(cnt)      
loop
  【結果】
Error 31 in line 3
異なる型を持つ配列変数に代入しました。

【例5】では「line3」つまり3行目でエラーになりました。「dim」なのだから整数型の「1」がエラーになるのはおかしい感じがします。むしろ実数「1.1」である2行目がエラーになってほしいものです。しかし3行目の整数「1」がエラーで正しいのです。型の基準は一番最初の要素で決定するようです。この例では一番最初の要素である0番に「1.1」という実数を代入した為、「dim」だけど実数型の配列になってしまったのです。「ddim」や「sdim」も同様です。一番最初の要素(0番)が型を決定すると覚えておきましょう。

型を決めるのにいちいち「0」番の要素に代入するのはめんどうです。いつも最初から全部に代入するとは限りません。デフォルトで整数や実数など「0」番の要素に代入されているので、「dim」は整数型、「ddim」は実数型、「sdim」は文字型と区別しといた方がよさそうですね。

 


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です