Skip to content

メモリ

対応:

  • Win
  • Cli

alloc

バッファを確保

グループ:

メモリ管理命令

パラメーター:

p1,p2 p1=変数 : バッファを割り当てる変数名 p2=1〜(64) : バッファのサイズ(Byte単位)

説明:

メモリ上にバッファを作成して変数に割り当てます。 割り当てられた変数は、文字列型となります。

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

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

参照:

sdim memexpand

追加対応:

  • Let

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 ldim dimtype

追加対応:

  • Let

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 ldim vartype

追加対応:

  • Let

poke

バッファに1byte書き込み

グループ:

メモリ管理命令

パラメーター:

p1,p2,p3 p1=変数 : バッファを割り当てた変数名 p2=0〜 : バッファのインデックス(Byte単位) p3(0) : バッファに書き込む値 または 文字列(Byte単位)

説明:

変数に保存されたデータメモリ上の任意の場所にある 1バイトの内容を書き換えます。

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

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

参照:

wpoke lpoke

追加対応:

  • Let

wpoke

バッファに2byte書き込み

グループ:

メモリ管理命令

パラメーター:

p1,p2,p3 p1=変数 : バッファを割り当てた変数名 p2=0〜 : バッファのインデックス(Byte単位) p3=0〜(0) : バッファに書き込む値(16bit整数値)

説明:

変数に保存されたデータメモリ上の任意の場所にある 2バイトの内容を書き換えます。

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

参照:

poke lpoke

追加対応:

  • Let

lpoke

バッファに4byte書き込み

グループ:

メモリ管理命令

パラメーター:

p1,p2,p3 p1=変数 : バッファを割り当てた変数名 p2=0〜 : バッファのインデックス(Byte単位) p3=0〜(0) : バッファに書き込む値(32bit整数値)

説明:

変数に保存されたデータメモリ上の任意の場所にある 4バイトの内容を書き換えます。

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

参照:

poke wpoke

追加対応:

  • Let

sdim

文字列型配列変数を作成

グループ:

メモリ管理命令

パラメーター:

p1,p2,p3... p1=変数 : 配列を割り当てる変数名 p2=1〜 : デフォルト文字数 p3=0〜 : 要素の最大

説明:

文字列型の配列変数を作成します。 dim命令との違いは、 p2のパラメータは「文字列のデフォルト文字数」、p3のパラメータ以降に実際の配列要素の最大数を入れるところです。


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

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

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

参照:

dim ddim ldim dimtype

追加対応:

  • Let

ddim

実数型配列変数を作成

グループ:

メモリ管理命令

パラメーター:

p1,p2... p1=変数 : 配列を割り当てる変数名 p2=0〜 : 要素の最大

説明:

実数型の配列変数を作成します。 パラメーターは、dim命令と同様に要素の最大数を指定します。


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

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

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

参照:

dim sdim ldim dimtype

追加対応:

  • Let

memcpy

メモリブロックのコピー

グループ:

メモリ管理命令

パラメーター:

p1,p2,p3,p4,p5 p1 : コピー先の変数 p2 : コピー元の変数 p3 : コピーするサイズ(1byte単位) p4 : コピー先の変数メモリオフセット(省略時=0) p5 : コピー元の変数メモリオフセット(省略時=0)

説明:

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

参照:

memset memexpand

追加対応:

  • Let

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

追加対応:

  • Let

dup

クローン変数を作成

グループ:

特殊代入命令

パラメーター:

変数名1 , 変数名2 変数名1 : クローンを作成する変数名 変数名2 : クローン元の変数名

説明:

クローン元の変数が持つメモリを指している変数を作成します。 クローン変数は、クローン元のメモリ情報を参照するための変数として機能するようになります。

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

参照:

mref dupptr

追加対応:

  • Let

dupptr

ポインタからクローン変数を作成

グループ:

特殊代入命令

パラメーター:

変数名,p1,p2,p3 変数名 : クローンを作成する変数名 p1=0〜 : クローン元のメモリアドレス p2=0〜 : クローン元のメモリサイズ p3=1〜(4) : クローン変数の型指定

説明:

指定したアドレスポインタを指している変数を作成します。 クローン変数は、メモリ上の情報を参照するための数値型配列変数として機能するようになります。

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

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

参照:

mref dup

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 a,64」とした場合、変数aがシステム変数 statと同等になり、値を代入することができるようになります。これにより、ユーザー定義命令内の計算結果などをシステム変数に反映して、呼び出し元に返すことができます。

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

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

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

参照:

dup dupptr #deffunc

追加対応:

  • Let

対応の補足:

HSPLet時、stat/refstr のみ使用可能です。 関数の引数には使用できませんので、3.0 形式の受け取り方をしてください。

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

delmod

モジュール型変数の要素削除

グループ:

メモリ管理命令

パラメーター:

p1 p1 : 変数名

説明:

p1で指定したモジュール型の変数の要素を削除します。 p1は、すでにモジュール型として設定されている変数である必要があります。


例 :
	delmod v.1

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

参照:

#modterm newmod

memexpand

メモリブロックの再確保

グループ:

メモリ管理命令

パラメーター:

p1,p2 p1 = 変数 : 対象となる変数 p2 = 0〜(64) : 再確保サイズ(1byte単位)

説明:

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

参照:

memcpy memset alloc

ldim

ラベル型配列変数を作成

グループ:

メモリ管理命令

パラメーター:

p1,p2... p1=変数 : 配列を割り当てる変数名 p2=0〜 : 要素の最大

説明:

ラベル型の配列変数を作成します。 パラメーターは、dim命令と同様に要素の最大数を指定します。


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

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

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

参照:

dim sdim ddim dimtype

newlab

ラベル型変数を初期化

グループ:

メモリ管理命令

パラメーター:

p1,p2 p1=変数 : 初期化する変数名 p2=参照元 : 参照されるラベルまたはオプション

説明:

指定されたラベルが代入されたラベル型の変数を初期化します。 p1で、初期化される変数名を指定します。 p2で、変数に保存されるラベルの参照元を指定します。 p2にラベルを指定した場合は、ラベルが示す場所を参照元とします。 この場合は、「変数=*ラベル名」と記述した場合と変わらない動作となります。 p2に数値を指定した場合は、以下の動作を行ないます。

 値  : 参照されるラベル

  0    次に実行されるプログラム位置を参照する
  1    次の1ステートをスキップした後に実行されるプログラム位置を参照する

p2が1の場合は、newlab命令の後にreturn命令が存在することを前提としています。 「newlab命令、return命令の次にあたる位置」が参照されることになります。 newlab命令は、ラベル型変数を特殊な値により初期化するためのものです。 単純なラベルの保存であれば、通常の代入文を使用する形で構いません。

参照:

ldim