Last Update : 2008/02/xx
文字列型変数のバッファサイズを再確保します。命令名の由来は、「memory expand」(メモリ拡張)から。
memexpand バッファ変数, 確保するバイトサイズ
第1パラメータには拡張対象の変数、第2パラメータには確保するバッファサイズ(64〜)をバイト単位で指定します。
変数という名の「入れ物」に想定以上のデータが代入されると、バッファの自動拡張がHSP内部で行われます。ただ、この機能にべったり頼ると、処理パフォーマンス(動作スピード)にモロに響くことになります。一方で、自動拡張機能を行わない命令の場合は、「バッファオーバーフローが発生しました」(エラー番号20)というHSPエラー(HSP内部エラー)が表示されます。
バッファの自動拡張機能を発動させない方法は、sdim命令で文字列型変数の領域をあらかじめ確保しておきます。ただ、この命令は呼ぶたびに変数の中身が初期化されてしまうので、中身のデータを維持したままバッファサイズのみ拡張できるのがこのmemexpand命令です。(バッファサイズの縮小は不可能)
まず、sdim命令のバッファサイズ確保です。64バイト→128バイトのサイズを確保すると、当然ながら中身の文字列データはなくなってしまいます。
; バッファサイズを確保(64バイト) sdim buf buf = "HSPのmemexpand命令の解説だよーん" ; バッファサイズを確保(128バイト) sdim buf, 128 mes "["+buf+"]"
逆にmemexpand命令は中身の文字列を維持したままバッファサイズを2倍に拡張できます。スクリプトエディタのデバッグウィンドウで変数bufを必ず確認してください。
; バッファサイズを確保(64バイト) sdim buf buf = "HSPのmemexpand命令の解説だよーん" ; バッファサイズを再確保(128バイト) memexpand buf, 128 mes "["+buf+"]"
sdim命令で用意した「入れ物」からデータが溢れる(=「バッファ・オーバーフロー」)ような状況になりそうなら、直前にmemexpand命令を使って「入れ物」の大きさを拡張させることで、処理パフォーマンスを落とさずに済みます。