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関連などなどありますが とりあえずこれだけ
他、追加して欲しいことがあれば掲示板やメールで教えてください

 

ホームへ