さて、初心者の方はメモリは特に意識していることは無いと思います。
でも、簡単なイメージを持っておくと、ゲームでもツールでもデータ管理をする場合
何かと役に立つと思います。
メモリ:名前の付いていない箱が並んだもの
変数:メモリの任意の箱に名前を付けたもの
となります。変数はメモリの任意の場所に作られます。これはコンピュータ(またはHSP)
が勝手に名前の付いていない、空っぽの箱に名前を付けてくれるので考えなくていいでしょう。
配列変数(dim)は、これに番号が振られるだけです。
それでは、文字列変数(sdim)はどうでしょう?HELPを見れば分かりますが
文字数を指定するようになっています。この文字数というのが、メモリの箱一つに
対応します。sdimは文字数だけの箱を全部まとめて名前を付けてしまいます。
これも、並んだ部分で20個なら20個まとめます。一つおきとか、一個だけ
別な場所ということは有りません。
あれ?sdimはdimのように番号が振られないのにどうやって、変数に入れたり、中身を見たりするのだろう?
sdimで用意された変数は、それで一つと考えるの普通です。だから
としても、メモリのうち20個の箱を確保しても、通常はaを1個として考えます。
こうした場合は、20文字はいるaという変数が5個確保されるわけです。
もちろん、メモリでは、20×5=100個の箱が確保されています。
では、sdimで用意された変数の途中の部分に、値を取り出したり入れたりするにはどうするのでしょう。
それには、peek、strmidやpokeを使用します。
sdim a,10
a="abcdefg"
peek b,a,0
mes "b="+b
b="" : strmid b,a,1,3
mes "b="+b
poke a,1,'B'
mes a
stop
|
sdimは一つと考えるように書きましたが、実際にはメモリの箱が有るので
dimと同じように0番目から指定して、変数の途中で値を取り出したり入れたり出来ます。
peekは文字ではなく数字が出てきました。これは
文字と文字列の扱いを参考にしてください。
HSPでは、他にもメモリを意識する命令が有るので紹介します。
a=10
dup b,a
b=0
mes "a="+a
stop
|
dup命令はHELPでクローンを作成する命令となっていますが、別々の物ではなく
全く同じ物で、箱の名前をもう一つ付ける物だと思っていいと思います。
(もちろん正確には違います(^^;)
なぜこんな面倒な・・・となりますが、配列変数は特に無駄に長い名前になる上に
何のデータが入っているか分からなくなる場合が有ります。そういうときに
この命令でわかりやすい名前にするのに使います。
mref vram,66
repeat winx*winy
poke vram,cnt*3,cnt\128*2
poke vram,cnt*3+1,cnt\128*2
poke vram,cnt*3+2,0
loop
redraw 1
stop
|
このmref命令はモジュール作成の際に使うのがほとんどなので普通は使わないと思います。
このサンプルでは、ウインドウ内画像データを直接書き換えています。
モジュール・サブルーチンを参考にしてください。