HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2006
0909
ピルクルint関数について7未解決


ピルクル

リンク

2006/9/9(Sat) 00:11:55|NO.2326

昨日からHSPを勉強しているのですが、タイトルのint関数で

引数に数値文字列以外が代入された場合が0になってしまいますが、
これを回避または判別する方法はあるのでしょうか?

というのも、練習として背景と文字色を変更出来るプログラムを作成してるのですが、
inputボックスに入力された値が通常の文字の場合はエラー処理を行いたいのです。
しかし、上記の機能により値が0と認識され、背景や文字色が暗色系になってしまいます。

Javaにあるtry catchのようなものがあればと思いましたが、HSPのヘルプやネットを探しても見つかりませんでした。
私の探し方にも問題があるのかもしれませんが、よろしければ回答をお願いします。



この記事に返信する


矢野

リンク

2006/9/9(Sat) 00:54:57|NO.2327


sdim buf,50 input buf,50,25

というように、インプットボックスは初期化しないと
インプットボックスに「0」が表示されます。
そのせいではないですか。



naznyark

リンク

2006/9/9(Sat) 01:30:45|NO.2329

int を使用する前に他の方法で引数文字列をチェックすればよいです。



osakana

リンク

2006/9/9(Sat) 02:24:15|NO.2330

こう言う事でしょうか?

a="0" input a,100,25,3 button "OK",*btn stop *btn frg=0 repeat 3 b=peek(a,cnt) if (b>=48)&(b<=57)!1 :frg=1 :break loop if frg=0 :mes int(a) else :dialog "文字は入力できません"
if (b>=48)&(b<=57)
がミソ。



Irisawa

リンク

2006/9/9(Sat) 06:25:10|NO.2332

もし、inputなどの入力オブジェクトを使用してユーザーに数値の入力を求めているなら
数値(正確にはこの場合は数値ではなく数字)しか入力できなくするという方法もあります。


#uselib "user32.dll" #cfunc GetWindowLong "GetWindowLongA" int, int #func SetWindowLong "SetWindowLongA" int, int, int #const GWL_STYLE -16 #const ES_NUMBER 0x2000 buf = "0" input buf, 100, 25, 3 hedit = objinfo(stat, 2) SetWindowLong hedit, GWL_STYLE, GetWindowLong(hedit, GWL_STYLE) | ES_NUMBER button "OK", *btn stop *btn dialog str(int(buf)) stop

ただし、16進数などを入力させたい場合はこれではダメですね。



ピルクル

リンク

2006/9/9(Sat) 21:42:18|NO.2338

 回答ありがとうございます。
 osakanaさんのソースを参考にやってみたところ解決できました。
 Irisawaさんのソースはまだ私には難しいのであとで調べてみます。

 アスキーコードで判別をしているのは分かったのですが、条件文の

  
if (b>=48)&(b<=57)!1 :frg=1 :break

 にある「!1」は何と「1」を比較しているのでしょうか?



LonelyWolf

リンク

2006/9/10(Sun) 01:37:16|NO.2339

条件式(b>=48,b<=57)は真のとき1、偽のとき0という値になります。
これは、&や|でさらにふるいにかけても変わりません。
つまり、!1 は !(真である)という意味で「真ではない」という意味です。

計算は×、÷を+、−より先に計算する要領で
!や=の方が&や|より先に計算されます。

b>=48 かつ b<=57が真ではない
つまり
b>=48 かつ b>57となるので、最終的にb>57とまとめられてしまいます。
試してみると分かるのですがb<48の部分にある#などが弾けていません。

正しくは

if ((b>=48)&(b<=57))!1 :frg=1 :break
です。

こうすれば
(b>=48 かつ b<=57)が真でない
つまり
bが48(=「0」)から57(=「9」)の範囲内にない
ということになります。

以下は余談になりますので、暇なときにでも読んでいただければ幸いです。
実際には0のとき偽で、それ以外のとき真となるため、
!1は必ずしも「真ではない」すなわち「偽である」を意味するとは限りません。
今回は条件式と論理積(&のことです)だけなので全く問題はないのですが。
私はそのときに分かりやすい書き方をすれば良いという考えなのですが、
「!1は使うべきではない。=0にすべきだ」という考えの方もいらっしゃいます。
実際に!1を使うべきでない場合もあるので頭の片隅に入れておくといいと思います。
プラグインやモジュールなど他のプログラマーが使うための
プログラムを書くときまではその場面がくることはないとおもいますが…。



osakana

リンク

2006/9/10(Sun) 03:21:49|NO.2341

>!や=の方が&や|より先に計算されます。
!の順位の方が高かったんですね、私も勉強になりました。
書いている時にどっちだろうと思い()で囲もうか迷ったんですが、
この場合なら大丈夫だと思って深く考えずに書いてました。

さっきのサンプルはelseの使い方がおかしかったので、
LonelyWolfさんの助言もふまえつつ少し修正してみました。

#define max 3 onkey *btn a="0" input a,100,25,max stop *btn objsel -1 if stat!0 :stop frg=0 repeat max b=peek(a,cnt) if ((b>=48)&(b<=57)|(b=0))!1 :frg=1 :break /*こんなんとか・・・ if ((b>=48)&(b<=57)|(b=0)) {} else {frg=1 :break} */ loop if frg=0 {mes int(a)} else { dialog "文字は入力できません" a="0" objsel 0 } stop



ONION software Copyright 1997-2021(c) All rights reserved.