Last Update : 2007/12/xx
文字列型変数の領域を確保する命令です。命令名の由来は、「string dimension」(文字列の次元配列)から。
sdim 変数, 確保バイト, 配列の要素数
変数と言う名の入れ物の大きさを指定します。HSPはデフォルトで64バイト分の文字列用領域が確保されます。たとえば、下のスクリプトはそれぞれ64バイトのサイズが確保された変数が用意されるわけです。HSPスクリプトエディタの[HSP]→[Debugウィンドウの表示]で確認してください。
aa = ""
sdim aa, 64
; 確保バイトを省略すると64バイト sdim aa
というわけで、64バイトを超えるサイズの場合は、このsdim命令を使ってバッファサイズをあらかじめ確保しておく必要があるわけです。そして、sdim命令は変数の内容の初期化としても機能します。
aa = "あいうえお" ; 128バイト確保 (元々代入されていた「あいういお」文字列は消滅! sdim aa, 128 mes "["+aa+"]
第3パラメータは配列変数の要素数(個数)です。(64バイト×要素数2=128バイト)
aa.0 = "" aa.1 = ""
sdim aa, 64, 2
sdim aa, , 2
要素数3つ。それぞれの要素で128バイト分確保。デバッグウィンドウで確認してください。(チェックボックスの[配列変数]を有効に)
sdim aa, 128, 3 aa.0 = "あ" aa.1 = "い" aa.2 = "う" mes ""+aa.2+" / "+aa.0+"
要素数は最大4次元まで用意できます。この多次元配列(2〜4次元配列)は、どちらかというとゲーム製作の分野で利用するものですな。
// 2次元配列 sdim aa, 64, 2, 3
aa.0.0 = "" aa.0.1 = "" aa.0.2 = "" aa.1.0 = "" aa.1.1 = "" aa.1.2 = ""
○ 関連情報
sdim命令と似たようなものに、整数値型変数の確保を行うdim命令、HSP3では実数値型変数の確保を行うddim命令があります。また、HSP2にはalloc命令もありますがsdim命令の利用が推奨されてます。HSP3ではalloc命令は事実上存在せず、コンパイル時にマクロ定義でsdim命令に置き換えられるようになってます。
たとえば、64バイトの確保してあるバッファに100バイトの文字列を入れると、36バイト足りないことになります。このような状態を「バッファオーバーフロー」(変数と言う名の入れ物から水があふれる)と言います。一般的にはこれは完全なエラーです。ただ、HSPにはバッファサイズの拡張機能というのが用意されており、もし足りない場合はエラーにならないよう自動でサイズを拡張する処理が内部で行われます。
じゃあ、sdim命令はどーでもいいような命令なのか・・・。ヘルプブラウザのsdim命令の説明をよく読んでください。
デフォルト文字数は、あらかじめ確保しておくメモリを指定することで、自動拡張時に余計な 処理がかからなくなるというものです。デフォルト文字数が少ない場合には、長い文字列が代入 されるたびに何度も文字列バッファの再確保が発生するため効率が落ちることがあります。
効率が落ちる、つまり動作スピードやパフォーマンスにどの程度響くのか。ぷまさんによると、この再確保1回で拡張するサイズは「4バイト」です。つまり、先ほどの例では9回(正確には最後にNULL文字が付くため10回)の再確保処理が内部で行われることになるようです。もっと大きなサイズだとしたら、再確保する回数がどんどんどんどん増えていくのは明らかでしょう。
sdim命令を使ってあらかじめ十分なバッファサイズを確保しておけば、拡張処理は働きません。もし、内部データを維持したままバッファサイズだけ拡張したいならば、memexpand命令も用意されてます。