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


HSPTV!掲示板


未解決 解決 停止 削除要請

2006
0414
さえdebugウィンドウで12解決


さえ

リンク

2006/4/14(Fri) 11:12:32|NO.380

聞くことばかりの さえでっす^^;
今回は debugウィンドウのことなんですが。
HSP実行と同時に表示させてみると、
項目のところの stat に数字が入っていて(52とあります)
ソフトのボタンをクリックするごとに 数値が増加し、
1000を超えたところでエラーが出てしまいます。
応急処置で onerror処理をつかって ソフトを再起動するように
しましたが、なぜこのエラーが出るのでしょうか?
基本的なことですみません○┓ペコリン

ちなみにボタンを押すとinputの値がボタンに設定してある数値だけ
プラスされて それをもとにして計算式が登録されたボタンを使って
点数を計算するというソフトです。



この記事に返信する


kz3

リンク

2006/4/14(Fri) 13:04:55|NO.381

  mref _stat, 64
_stat = 1000 _stat = 1001
としてみましたがstatの値は直接関係しないような気がします。

> ちなみにボタンを押すとinputの値がボタンに設定してある数値だけプラスされて

全くさえさんのスクリプトの構造が分かりませんが、
  input num
button "10", *add stop *add num += 10 objprm 0, num stop
このようなスクリプトではstatの値は変化( 52->1000 )せず問題なく動いています。

> なぜこのエラーが出るのでしょうか?

システムの問題なのか、スクリプトの問題なのか、これだけでは分かりません。
再現可能なスクリプトを示されたら原因が特定できるかも知れませんよ。
( スクリプトが長い場合は怪しい部分に絞って )

あとシステム的なエラーと思ったときはhspのバージョンも一緒に添えると、
原因特定の手助けになるかもです。
( 前ver.では見られない症状が新ver.で現れるようになった、など )



さえ

リンク

2006/4/14(Fri) 13:22:38|NO.382

さっそくの回答ありがとうございますm(__)m
基本的な構造を部分的にコピーしました。
HSPのVerは β版の 3.1です。
*main
pos 5,0 : mes"計"
objsize 30,20
pos 25,0 : input a

objsize 100,20
button "押す",*tasu
stop
*tasu
a+1 : goto *main : stop



Irisawa

リンク

2006/4/14(Fri) 13:24:49|NO.383

ループなどの中でHSPオブジェクトを作成していると同じ場所にいくつもHSPオブジェクトが
重なって表示されてしまい、HSPオブジェクトの最大配置可能数1024個を超えてしまっている
のではないでしょうか。
以下のような感じ。


sdim buf repeat 1025 pos 0, 0 input buf loop

上記のコードの場合、(できるだけ早く終わらせるためwaitやawaitを入れていないので)
実行するとしばらく応答なしと同じ状態になるのでご注意ください。



Irisawa

リンク

2006/4/14(Fri) 13:38:17|NO.384

と、書いている途中で返信があったみたいですね。
予想したとおり、ループの中でbuttonオブジェクトを作成しているのが原因です。

以下のように修正してください。


pos 5, 0 mes "計" gosub *view pos 0, objsize 100, 20 button "押す", *tasu stop *tasu a++ clrobj id, id gosub *view stop *view objsize 30, 20 pos 25, 0 input a id = stat return



Irisawa

リンク

2006/4/14(Fri) 13:41:00|NO.385

っていうより、実際にはオブジェクトをワザワザ破棄して作り直す必要はないんですが。


pos 5, 0 mes "計" objsize 30, 20 pos 25, 0 input a id = stat pos 0, objsize 100, 20 button "押す", *tasu stop *tasu a++ objprm id, a stop



kz3

リンク

2006/4/14(Fri) 13:48:05|NO.386

>予想したとおり、ループの中でbuttonオブジェクトを作成しているのが原因です。

ですねー。
ちょっとの差でIrisawaさんが答えてくれました。^^

# 質問とは関係ないところで気になりましたが、
# 前からスレッド一覧のpersonの部分ですが、
# 掲示板が出来た時から、スレッドを立ち上げた人の名前で固定でしたっけ...?
# 最終投稿者名のほうが何かと良かったりしませんか?



Irisawa

リンク

2006/4/14(Fri) 13:51:05|NO.387

この間違いってHSP初心者はよくやりますね。
今までに同じ質問とか何度あった事やら。
(よく考えればエラーになるのは当たり前のはずなんですけど)

知らずに潜在的に問題のある実装をしている人がどれだけいるのかな。

この対策ってとれないのでしょうか。
オブジェクトを同じポジションに重ねようとしたときに警告かエラーをだすようにして
ワザと重ねたいときにはプリプロセッサなどで回避可能にするとか。



kz3

リンク

2006/4/14(Fri) 15:33:53|NO.388

というかさえさんの示したスクリプトでもちゃんとエラー時には
「オブジェクトが多すぎる」というエラーが表示されていますよね。
ここでよーくスクリプトを読めば気づくハズなのですが...

>この対策ってとれないのでしょうか。
>オブジェクトを同じポジションに重ねようとしたときに警告かエラーをだすようにして

この問題の対策は過剰にオブジェクトを作成すると警告を出す、のままでいいと思いますよ。
1024個が妥当かどうかはプログラムによって変わるので何とも言えませんがね^^;

このテの問題はスクリプトの流れと意味をよーく考えて書けば初心者の方でも防げますしね。

>ワザと重ねたいときにはプリプロセッサなどで回避可能にするとか。

そこまでシステムが面倒みるのもどうかと思ったりするところがあるので、
ユーザー側で予めオブジェクトの最大数を設定できるようにするのはどうかな、
と思ってこんなモジュールこさえました。
#module "object"
; objlim p1, p2 ; 現在描画先ウィンドウの作成できる最大オブジェクト数を変更する ; p1: オブジェクトの最大数 ; 省略、0以下を指定した時は現在の最大数をstatに格納する。 ; 現在作成されているオブジェクト数が設定しようとする数より多い場合は ; 新しいオブジェクトを切り詰めます( 矯正 )。 ; p2: 対象ウィンドウのID ; 省略、負数を指定した時は描画先ウィンドウが対象となる。 #define global objlim(%1=0,%2=-1) objlimit %1, %2 #deffunc objlimit int p1, int p2 if( p2 < 0 ): mref bm, 67: else: mref bm, 96 + p2 if( p1 > 0 ){ if( bm.72 > p1 ){ clrobj p1, -1 bm.72 -= bm.72 - p1 } bm.73 = p1 } return bm.73 #global ; サンプル objlim : mes stat ; 現在の最大オブジェクト数取得 repeat 10 input num loop objlim 5 : mes stat ; 最大数を5個に減らす( 矯正 ) objlim 8 : mes stat ; 最大数を8個に増やす repeat 10 input num loop

"矯正"の仕様が微妙ですが、HSPの仕様です。
# 制限を設けてあるため、制限を越えることをHSPは考慮していない為。
# あくまで予想です。



さえ

リンク

2006/4/14(Fri) 15:41:17|NO.389

(ノд`。)タハァ
少しの間にすごく沢山の返信ありがとうございますm(__)m
goto を objprm に変更する事により 解決しました(^O^)
オブジェクトを重ねていたんですね^^;
でも、こういうことが原因でエラーが出るということがはっきりわかったので
すんごく勉強になりました♪
また何かあったらよろしくお願いします<(_ _*)>ぺこ



さえ

リンク

2006/4/14(Fri) 15:46:04|NO.390

わお♪
kz3さんどうもo(*^▽^*)oアリガト♪
私が返信している間にモジュールまで作っていただいて^^;
今回は 前スレの事をして解決しましたが、モジュールも何かの
役に立つと思うので使用させていただきます○┓ペコリン



kz3

リンク

2006/4/14(Fri) 16:01:27|NO.391

支障はないと思いますが、モジュール一部訂正。

15行目付近の
bm.72 -= bm.72 - p1

bm.72 = p1
でいいです。



さえ

リンク

2006/4/14(Fri) 17:02:02|NO.392

了解しました♪
o(*^▽^*)oアリガト♪



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