HSP 2.Xと 3.X の プログラムの違い
2005年8月1日 新しくHSP3.0 が登場しました
今までの 2.61などの HSP2.X と違い 実数(小数)やCOMコンポネート呼び出し そして 関数の導入 が 大きな違いでしょう
ここでは 具体的に 何がどう違って 3.Xでプログラムを書くときに 2.Xと違う部分などを紹介していきます
・・・・といっても リファレンスの書き写しみたいなものですが(^^;)
〜変更点〜
では先ず 変わったところを紹介していきます
〜文字列型変数〜
変数で変わったところは 先ず 文字列型の場合 バッファの自動確保がされます
今までだと a="あいうえおあいうえお・・・・" と沢山の文字を変数に入れる場合や ファイルのロードのとき
sdim命令などで 変数の容量を確保していましたが
その必要はなくなり 自動的に容量をとってくれます
〜配列変数〜
これも変わったところです 書き方が違います
a.1 → a(1)
こう書く事になります
ただし a.1 と 昔のように書いた場合も エラーにはなりません
配列は 自動で確保されます 前は dim
sdim命令で 要素を確保しないとだめでしたが その必要はありません
ただし それはa(100)=111 のように 配列変数に代入するときに確保されるので
何もしないで b=a(1)
と書くと エラーになります
だから なるだけdim命令で 使う配列を指定した方がいいかもしれません それか
a(1000)=0 のように 代入しておくと a(0)〜
a(1000) まで自動的に 確保されるので
b=a(1) としても大丈夫です
OK | ||
a(100)=1 | ||
自動でa(0)〜a(100)まで確保される | ||
エラー | OK | OK |
b=a(1) | dim a,10 b=a(1) |
a(10)=0 b=a(1) |
a(1)が確保されていないからダメ | dim命令でa(9)まで確保したからOK | a(10)=0で a(0)〜a(10)まで自動で確保されたからOK |
ちなみに 多次元配列変数の書き方は
a.1.1 → a(1,1)
となりました(a.1.1でもエラーは無い) 他は 今まで通りで a(1+2) のように 式を書いてもOKです
文字列型の配列変数ですが sdimで文字列型として指定しないと使えません
今まで通りsdimをする必要があります ただし 1度使っちゃえば 後は自動で容量は確保されます
ちなみに文字数は気にしなくてOKです 足りなくなると自動で拡張してくれます
エラー | OK | OK |
a(0)="a" | sdim a,2,1 a(0)="A" |
sdim a,2,1 a(10)="A" |
文字列型として確保してないからダメ | sdim命令でaは文字列型になったからOK | sdimでaは文字列になったのでa(10)とやっても 自動で確保してくれるようになった |
〜式の順序変更〜
今まで +-*/はどれも同じ扱いでしたが 6-2*2 のような計算の場合 */を優先して計算するようになりました
2.X | 3.X |
a=6-2*2 | a=6-2*2 |
6-2で4 4*2で 8 aは8 になります |
2*2で4 6-4で2 aは2 になります |
こんな具合です
ちなみに、算数と同じで ()でくくったものは1番最初に計算されます つまり3.0でも
a=(6-2)*2 とすれば 6-2が先に計算されるので aは8になります
〜関数〜
これが1番やっかいなところと言っていいでしょう
HSP3.0から導入された関数ですが それまでの2.Xには無かったので とっつきにくい所であります
関数についてはHSP入門コウザ 関数さん、これだとどうなるの? にありますので そこを観てください
今まで命令だったけど関数になった よく使う命令リストです(リファレンスよりほぼコピー)
2.Xまで | 3.Xから |
int a | a= int(a) |
str a | a= str(a) |
rnd a,10 | a= rnd(10) |
gettime a,0 | a= gettime(0) |
peek a,b,10 | a= peek(b,10) |
wpeek a,b,10 | a= wpeek(b,10) |
strlen a,b | a= strlen(b) |
sysinfo a,b | a= sysinfo(b) |
getpath a,b,0 | a= getpath(b,0) |
strmid a,b,0,10 | a= strmid(b,0,10) |
instr a,b,0,"z" | a= instr(b,0,"z") |
ginfo a,10 | a= ginfo(10) |
ちなみに notemaxは システム変数になりました
他にも こんな関数が用意されています 使い方はHSPのヘルプで見てください
length | |
length2 | |
length3 | |
length4 | |
vartype | |
varptr | |
varuse | |
dirinfo | |
lpeek | |
double | |
sin | |
cos | |
tan | |
atan | |
sqrt | |
logf | |
expf | |
abs | |
absf | |
limit | |
limitf | |
ginfo | |
objinfo |
今まで命令だったけど 関数になったものについては 注意が必要ですので 確認しておきましょう
〜名前が変わった 無くなった命令 システム変数〜
これもやっかいですね 3.0になって 無くなった命令や 名前が変わったの そしてシステム変数も変わったのがあります
まず 名前が変わった命令
2.X | 3.X |
sndload | mmload |
snd | mmplay |
sndoff | mmstop |
これだけだったかな
次に 無くなった命令&違う命令に吸収されたもの
消滅 | 内容 |
skiperr | 代わりにonerrorを使う |
objsend | 代わりにsendmsgを使う |
palfade | なにもなくなった |
palcopy | なにもなくなった |
getpal | palcolorと同機能 |
text | hsp3util.asモジュールでサポート |
llmod関連命令 | なにもなくなった |
loadlib関連命令 | 1部、詳しくはリファレンスを見てください |
こんな感じです
次にシステム変数 名前が色々代わってます
注意して欲しいのが上にも書きましたがnotemaxはシステム変数になりました
2.X | 3.X |
notemax a | a=notemax |
csrx | ginfo_cx |
csry | ginfo_cy |
paluse | ginfo_paluse |
dispx | ginfo_dispx |
dispy | ginfo_dispy |
rval | ginfo_r |
gval | ginfo_g |
bval | ginfo_b |
winx | ginfo_winx |
winy | ginfo_winy |
cmdline | dir_cmdline |
windir | dir_win |
curdir | dir_cur |
exedir | dir_exe |
sysdir | dir_sys |
prmxとprmy | ginfoの仕様変更でなくなった |
こんなところです
〜その他細かい変更点〜
〜HSPCLのご注意〜
いままで2.Xで HSPCL(コンソールモードのHSP)を使う場合は 「コンソールモード」にチェックを入れればよかったのですが
3.Xで HSPCLを使う場合は ランタイムの読み込みが必要です
#runtime "hsp3cl"
と この一文字をプログラムの最初の方に書けば コンソールモードとして使えます
〜stop無くても止まります〜
2.Xでは 例えば print "a" とだけプログラムを書いて実行すると ウインドウが開いてすぐ閉じるのでstop命令が必要ですが
3.Xでは print "a" とだけやっても プログラムが無いと自動的にstopがかかり止まってしまいます
〜ウインドウのボタン〜
2.Xでは ウインドウID0のウインドウにしか 右上の _□× みたいな 3つのボタンが出ませんでしたが
3.Xでは screenで作られる 全てのIDのウインドウに 右上の3つのボタンが表示されて 使えます
これだけの変更に注意すれば とりあえず 2.Xの技術で 3.X のプログラムを書くことができるはずです ある程度ね
次は 3.0から使えるようになった 新しい機能の紹介です
〜使えるようになったところ〜
〜実数〜
なんと言ってもこれはうれしい。小数(実数と言います)が使えるようになったんですからね
こうやって使います
a=1.2+2.5
この場合aは3.7になります その場合print
a などと書くと
3.700000 のように表示されると思いますが これは正常なので気にしないで下さい
ちなみに
a=1.2+2
としても ちゃんと 3.2 となりますが
a=2+1.2
とすると 3 になってしまいます
これは 計算式の一番最初の数字の種類に合わせて計算をする
からで さっきの 2+1.2 は 2が整数で 1.2が小数です
で最初に書いてあるのは2なので そのせいで 1.2 は1として計算されてしまいます
そうならないためには 1.2+2 って実数を先に書くか
2.0+1.2
とわざと実数にすれば ちゃんと計算されます
それと 変数に代入するときもそうです その変数に初めて入れる数字が実数じゃないと 後から実数をたしても失敗します
後から実数を a=a+1.2 の用にしても a=a+1 とされてしまいます
a=2 a=a+2.2 print a |
a=2.0 a=a+2.2 print a |
a=2.0 a=a+2 print a |
a は4になります | a は4.2になります | aは 4になりますが、今後実数を使える変数となります |
ちなみに 実数の計算は 2+4 などの整数の計算より 時間とメモリを食うので注意した方がいいでしょう
〜button gosub*a〜
button にgosubの機能がつきました
今まで通り button "ボタン",*a
と書けば 今まで通りのbuttonですが
この場合は ただgotoのようにジャンプするだけでした
3.0からbuttonは サブルーチンのように戻れるようにできるんです
button gosub "ボタン",*a
のように書くと gotoじゃなくgosubでジャンプしたときのようにreturn命令で*aから戻ることができます
button gosub "ボタン",*a ・・・・・・・ ・・・・・ stop *a return |
こんな風に書くことができます
で このreturn どこに戻るかと言うと buttonじゃなくて 「さっきまで実行していたところに戻る」ことができます
上のプログラムだと多分stopで止まっていたと思いますが ボタンを押されたからと言ってbutton命令の下の行に
ジャンプをしたりはしません ボタンを押される前の行に戻ることができます この場合またstopに戻りますね
何が便利かというと repeat〜loopなどで処理をしているときに ボタンを押されて
又始めの方からの処理に戻るとか 「サブルーチンのネストが深すぎます」などの 嫌なことを避けれます
ただし stopで止まっているときなどに使う場合は button
gosubだとreturnで戻ってきたときに
またstopで止まることになるので注意が必要です
とりあえず ばーっと 書くとこんなところです
もちろん増えた命令は もっとあります 円関連や画像回転やnet関連などなどありますが とりあえずこれだけ
他、追加して欲しいことがあれば掲示板やメールで教えてください