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