HSPリファレンス トップ »

メモリ管理 (HSP3)


alloc命令

・メモリ管理命令
alloc p1,p2		[バッファを確保]
p1=変数    : バッファを割り当てる変数名
p2=1〜(64) : バッファのサイズ(Byte単位)
メモリ上にバッファを作成して変数に割り当てます。
割り当てられた変数は、文字列型となります。

この命令は過去のHSP命令との互換を取るために用意されています。
通常は、sdim命令を使用することを推奨します。

※この命令は、マクロとしてhspdef.as内で定義されています。

§ sdim memexpand


ddim命令

・メモリ管理命令
ddim p1,p2...		[実数型配列変数を作成]
p1=変数 : 配列を割り当てる変数名
p2=0〜  : 要素の最大
実数型の配列変数を作成します。
パラメーターは、dim命令と同様に要素の最大数を指定します。

例 :
	ddim a,100 ; 変数aはa(0)〜a(99)までの実数型配列を確保します

dim命令と同様に多次元配列を確保することが可能です。
多次元配列は、4次元まで確保することが可能です。
ddim命令はスクリプト内のどこででも定義・再定義することが可能です。
また、配列変数を作成すると内容はすべて0にクリアされます。

※この命令は、マクロとしてhspdef.as内で定義されています。

§ dim sdim dimtype


delmod命令

・メモリ管理命令
delmod p1		[モジュール型変数の要素削除]
p1 : 変数名
p1で指定したモジュール型の変数の要素を削除します。
p1は、すでにモジュール型として設定されている変数である必要があります。

例 :
	delmod v.1

delmod命令は、#modterm命令により解放ルーチン(デストラクタ)が定義されて
いる場合は、自動的に呼び出しを行ないます。
モジュール型の変数についての詳細は、newmod命令のヘルプやプログラミング
マニュアルを参照してください。

§ #modterm newmod


dim命令

・メモリ管理命令
dim p1,p2...		[配列変数を作成]
p1=変数 : 配列を割り当てる変数名
p2=0〜  : 要素の最大
任意の要素を持つ配列変数を作成します。

例:
	dim a,20

上の例では、変数aの要素を20個、つまり「a(0)」〜「a(19)」までをあらか
じめ確保します。

パラメータを増やすことで多次元配列を作成することも可能です。

例:
dim a,10,5	: 変数aは2次元配列
a(0,0)=1	: 要素(0,0)に1を代入
a(1,0)=2	: 要素(1,0)に2を代入
a(0,1)=3	: 要素(0,1)に3を代入

上の例では、a(0,0)から、a(9,4)までを使用できるようになります。
多次元配列は、4次元まで確保することが可能です。

dim命令はスクリプト内のどこででも定義・再定義することが可能です。
また、配列変数を作成すると内容はすべて0にクリアされます。

§ sdim ddim dimtype


dimtype命令

・メモリ管理命令
dimtype p1,p2,p3...		[指定タイプの配列変数を作成]
p1=変数     : 配列を割り当てる変数名
p2=型タイプ : 変数の型タイプ
p3=0〜      : 要素の最大
任意の要素を持つ配列変数を作成します。
dim命令と同様の動作ですが、dimtypeは変数の型を指定することができます。
p2には、変数型を示す型タイプ値を指定する必要があります。
型タイプ値は、vartype関数で型名文字列から取得することが可能です。

例 :
	dimtype a,vartype("double"),20

上の例では、実数型変数aの要素を20個、つまり「a(0)」〜「a(19)」までを
あらかじめ確保します。
dim命令と同様に多次元配列を確保することが可能です。
多次元配列は、4次元まで確保することが可能です。

§ dim sdim ddim vartype


dup命令

・特殊代入命令
dup 変数名1 , 変数名2		[クローン変数を作成]
変数名1 : クローンを作成する変数名
変数名2 : クローン元の変数名
クローン元の変数が持つメモリを指している変数を作成します。
クローン変数は、クローン元のメモリ情報を参照するための変数として機能す
るようになります。

クローン元の型が変更されたり、配列の拡張、または文字列バッファの拡張が
行なわれた場合には、クローンとしての動作は行なわれなくなります。
クローンが有効なのはクローン元の変数に代入が行なわれるまでの間だという
点に注意してください。dup命令は、以前のバージョンとの互換性維持と、 低
レベルでの変数バッファ操作を行なうための機能として残されています。
また、メモリアドレスから直接クローン変数を作成するdupptr命令も用意され
ています。
初心者向けに、dup命令を推奨することはありません。

§ mref dupptr


dupptr命令

・特殊代入命令
dupptr 変数名,p1,p2,p3		[ポインタからクローン変数を作成]
変数名    : クローンを作成する変数名
p1=0〜    : クローン元のメモリアドレス
p2=0〜    : クローン元のメモリサイズ
p3=1〜(4) : クローン変数の型指定
指定したアドレスポインタを指している変数を作成します。
クローン変数は、メモリ上の情報を参照するための数値型配列変数として機能
するようになります。

p3で作成されるクローン変数の型を指定することができます。
p3の値は、vartype関数で取得される型を示す値と同じです。 p3を省略した場
合は、4(整数型)となります。

クローン変数は、指し示しているメモリの位置が変更されてもそれを検知する
ことはできません。たとえば、変数に格納されているデータのメモリアドレス
を指し示していたとしても、変数の型や内容が更新されてメモリ位置が変更さ
れた場合に正しく参照することはできません。
あくまでも、一時的なメモリ参照にのみ使用し、取り扱いには十分に注意して
ください。dupptr命令は、 DLL等の外部関数で取り交わすメモリ参照や低レベ
ルでの変数バッファ操作を行なうための機能として用意されています。
初心者向けに、dupptr命令を推奨することはありません。

§ mref dup


lpoke命令

・メモリ管理命令
lpoke p1,p2,p3		[バッファに4byte書き込み]
p1=変数   : バッファを割り当てた変数名
p2=0〜    : バッファのインデックス(Byte単位)
p3=0〜(0) : バッファに書き込む値(32bit整数値)
変数に保存されたデータメモリ上の任意の場所にある 4バイトの内容を書き換
えます。

p1で指定した変数のバッファ上で、p2で指定したインデックスの場所にp3の値
を書き込みます。値は0〜$ffffffffまでの4バイト(32bit)値になります。

§ poke wpoke


memcpy命令

・メモリ管理命令
memcpy p1,p2,p3,p4,p5		[メモリブロックのコピー]
p1 : コピー先の変数
p2 : コピー元の変数
p3 : コピーするサイズ(1byte単位)
p4 : コピー先の変数メモリオフセット(省略時=0)
p5 : コピー元の変数メモリオフセット(省略時=0)
p1で指定された変数に割り当てられているメモリ領域に、
p2で指定された変数に割り当てられているメモリの内容をコピーします。
コピーするサイズ(1byte単位)は、p3で指定します。
大きな領域を変数に割り当てている場合などに高速なメモリコピーを
行なうことができます。
p4,p5で、コピー先、コピー元の開始位置を1byte単位で調整することができま
す。
変数が確保している領域を越える指定がされている場合は、バッファオーバー
フローのエラーになります。

§ memset memexpand


memexpand命令

・メモリ管理命令
memexpand p1,p2		[メモリブロックの再確保]
p1 = 変数    : 対象となる変数
p2 = 0〜(64) : 再確保サイズ(1byte単位)
p1で指定された変数が持つメモリ領域の再確保を行ないます。
代入時などのメモリ領域確保はシステムが自動的に行なっていますが、
明示的にサイズを変更する場合に使用します。
再確保を行なった場合でも、以前までの内容は保持されます。
p2で、再確保サイズを指定します。p2の値が64より小さい場合は自動的に64に
合わせられます。すでに確保されているサイズよりも小さな値を指定した場合
は何も行われません。
p1で指定される変数は、 文字列型(str)のように動的にメモリ確保量を変更す
ることが可能な型である必要があります。
再確保ができない型の場合には、エラーになります。

§ memcpy memset alloc


memset命令

・メモリ管理命令
memset p1,p2,p3,p4		[メモリブロックのクリア]
p1=変数      : 書き込み先の変数
p2=0〜255(0) : クリアする値(1byte)
p3=0〜(0)    : クリアするサイズ(1byte単位)
p4=0〜(0)    : 書き込み先の変数メモリオフセット
1byteの固定値でメモリブロックを埋めます。
p1で指定された変数に割り当てられているメモリ領域に、p2で指定された値を
、p3のサイズだけ書き込みます。大きな領域に同じ値を書き込みたい時に有効
です。p4で、メモリ開始位置を1byte単位で調整することができます。
変数が確保している領域を越える指定がされている場合は、バッファオーバー
フローのエラーになります。

§ memcpy memexpand


mref命令

・特殊代入命令
mref p1,p2		[特殊なメモリを変数に割り当てる]
p1=変数名 : 割り当てられる変数名
p2=0〜(0) : リソースID (割り当てるメモリ内容)
p1で指定された変数に、p2で指定したメモリ内容を割り当てます。

     値  : 対応するリソース
 --------------------------------------------------
   0〜 7 : ローカルパラメータ#1〜8(数値)
    64   : システム変数stat
    65   : システム変数refstr
    66   : ウィンドウ内画像データ(VRAM)
    67   : 現在のウィンドウ情報(BMSCR構造体)
    68   : HSPのシステム情報(HSPCTX構造体)
    69   : パレット情報
    96〜 : ウィンドウID0〜の情報(BMSCR構造体)

リソースID64,65のシステム変数は、たとえば「mref i,64」とした場合、変数
aがシステム変数 statと同等になり、値を代入することができるようになりま
す。これにより、ユーザー定義命令内の計算結果などをシステム変数に反映し
て、呼び出し元に返すことができます。

リソース66のウインドウ内画像データ(VRAMデータ)は、表示されている画像を
内容とする配列変数になります。
これにより、 poke,peek命令などで画像データに直接アクセスが可能になりま
す。

リソース67以降も同様に HSPの内部データに直接アクセスできるようにするも
のですが、通常は使う必要はありません。 DLLへ渡すためのパラメータ準備の
ためなど、ごく限られた用途のために用意されているもので、ほとんどの人は
使うことはないはずです。

ローカルパラメータは、ユーザー定義命令(#deffunc)で新規に追加された命令
のパラメータ内容を取得するためのものです。
パラメータのタイプ(数値、変数、文字列)に従って取得することが可能です。
ローカルパラメータ取得は、HSP2.xまでのパラメーター取得方法との互換のた
めに用意されています。(一部のリソースタイプには互換性がありません。)
HSP3.0以降では、ユーザー定義命令(#deffunc)のエイリアス機能を使用するこ
とを推奨しています。

§ dup dupptr #deffunc


newmod命令

・メモリ管理命令
newmod p1,p2,p3...		[モジュール型変数の作成]
p1    : 変数名
p2    : モジュール名
p3... : 初期化パラメーター
p1で指定した変数をモジュール型として要素の追加を行ないます。
p1の変数がモジュール型でない場合は、モジュール型として初期化されます。
すでにモジュール型の場合は、配列変数として新しい要素を追加していきます。
p2ですでに登録されているモジュール名を指定し、p3以降に初期化パラメータ
ーを指定することができます。
モジュール変数は、複数の変数やデータをまとめて管理することができる新し
いデータ格納方法を提供します。

例 :
	#module a x,y,z

上の例では、aというモジュールにx,y,zという3つの変数を持たせています。
aというモジュールの型を持つ変数は、x,y,zという変数すべてを内包したもの
になり、モジュール処理命令(#modfunc)で扱うことが可能になります。

例 :
	newmod v,a

上の例では、モジュール「a」のための変数vを初期化します。
これで変数vには、モジュール「a」 が持つモジュール変数x,y,zという内容が
丸ごと格納されることになります。
モジュールごとに初期化のための命令(#modinit)を用意している場合は、p3以
降のパラメーターが初期化命令に渡されます。

例 :
	#module a x,y,z
	#modinit int p1,int p2,int p3
	x=p1:y=p2:z=p3
	return
	#global
	newmod v,a,1,2,3

モジュール型の変数は、newmod、delmod命令で要素の操作を行なうことが
できるほか、 foreach命令などとともに複雑なデータを簡潔に処理することが
できるようになります。

§ #modfunc #modinit #modterm delmod foreach


poke命令

・メモリ管理命令
poke p1,p2,p3		[バッファに1byte書き込み]
p1=変数 : バッファを割り当てた変数名
p2=0〜  : バッファのインデックス(Byte単位)
p3(0)   : バッファに書き込む値 または 文字列(Byte単位)
変数に保存されたデータメモリ上の任意の場所にある 1バイトの内容を書き換
えます。

p1で指定した変数のバッファ上で、p2で指定したインデックスの場所にp3の値
を書き込みます。値は0〜255までの1バイト(8bit)値になります。

p3に文字列を指定した場合には、文字列データをメモリに展開し、
strsizeに、書き込まれた文字列の長さを返します。

§ wpoke lpoke


sdim命令

・メモリ管理命令
sdim p1,p2,p3...		[文字列型配列変数を作成]
p1=変数 : 配列を割り当てる変数名
p2=1〜  : デフォルト文字数
p3=0〜  : 要素の最大
文字列型の配列変数を作成します。 dim命令との違いは、  p2のパラメータは
「文字列のデフォルト文字数」、p3のパラメータ以降に実際の配列要素の最大
数を入れるところです。

例 :
	sdim a,5000 ; 変数aは5000文字ぶんのメモリをあらかじめ確保します

上の例では、変数aは5000文字ぶんのメモリを確保し配列変数にはなりません。
デフォルト文字数は、あらかじめ確保しておくメモリを指定することで、自動
拡張時に余計な処理がかからなくなるというものです。
デフォルト文字数が少ない場合には、長い文字列が代入されるたびに何度も文
字列バッファの再確保が発生するため効率が落ちることがあります。

多次元配列の場合は、文字数とは別に4次元まで確保することが可能です。
sdim命令はスクリプト内のどこででも定義・再定義することが可能です。
また、配列変数を作成すると内容はすべて0にクリアされます。

§ dim ddim dimtype


wpoke命令

・メモリ管理命令
wpoke p1,p2,p3		[バッファに2byte書き込み]
p1=変数   : バッファを割り当てた変数名
p2=0〜    : バッファのインデックス(Byte単位)
p3=0〜(0) : バッファに書き込む値(16bit整数値)
変数に保存されたデータメモリ上の任意の場所にある 2バイトの内容を書き換
えます。

p1で指定した変数のバッファ上で、p2で指定したインデックスの場所にp3の値
を書き込みます。値は0〜65535までの2バイト(16bit)値になります。

§ poke lpoke


¤ Original Document by ONION Software / HTML Document by Let's HSP!