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


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
0903
フワット・ベベHSPに欲しいエラー機能25解決


フワット・ベベ

リンク

2012/9/3(Mon) 19:10:13|NO.49080

プログラムの無限ループに、wait命令、await命令、がないとエラー表示する
機能があれば安全かも、と思います。
そうすれば、うっかりパソを占領される事がなくなるのでは、と。



この記事に返信する


ウルフルフ

リンク

2012/9/3(Mon) 19:18:36|NO.49082

ンー、確かにいいけど、そこまで問題には、ならないような。



L-35K

リンク

2012/9/3(Mon) 20:23:59|NO.49085

やっても警告程度に限ると思います。
こんなスクリプトが弾かれたら困りますし。

a=0 repeat a+ if a=15:break loop



y.tack

リンク

2012/9/3(Mon) 21:12:47|NO.49086

await 1とかが必須になると1000回くらいループするなら遅そうです
拙作で申し訳ないですけど
http://space.geocities.jp/digital_clock_2006/HSP/module/some_awaits.htm
こんなのなら遅くならないかな?
errorというより
繰り返し時、自動的にawait 1の100分の1くらい止まったら便利だと思います
Cは無限ループしても応答してくれますよね



FunnyMaker

リンク

2012/9/3(Mon) 22:22:55|NO.49090

では、wait,await系の命令が挟まっていない状態でループ回数が1000回ぐらいになっているのを
検出するとデバッグウィンドウとかに「報告」されるくらいがちょうどいのかもしれませんね。

それと、自分の思っている「HSPに欲しいエラー機能」を勝手ながら一つ述べさせていただきますが、
エラー機能というカテゴリに入るかどうか微妙なのですが、サブルーチン先でエラー(例えば画像ファイル
をpicloadしようとしたけど、無かった為読み込めなかった時とか)が起こってもちゃんとreturnで
帰ってこられるようにもなって欲しいと思いますね。この頃よく思います。



てれてれ

リンク

2012/9/3(Mon) 22:27:36|NO.49091

picloadでイメージファイルが壊れている時にエラー吐かずにstatにでも結果代入してくれると嬉しいですね。



y.tack

リンク

2012/9/3(Mon) 22:38:51|NO.49092

>では、wait,await系の命令が挟まっていない状態でループ回数が1000回ぐらいになっているのを
>検出するとデバッグウィンドウとかに「報告」されるくらいがちょうどいのかもしれませんね。
よく考えるとループの長さってスクリプトの処理時間とかあるから
ループ一回に1秒かかると100回繰り返すのに一分以上かかってしまいますね

素直にこういうマクロ定義しちゃったらどうですか?

#define await1_loop await 1:loop repeat logmes ""+cnt await1_loop



FunnyMaker

リンク

2012/9/3(Mon) 22:55:29|NO.49094

そうでしたね! ループ内での1回りあたりの所要時間のことをうっかり忘れていました。
それと、logmes って便利ですね。こんなのがあったとは。今まで、怪しいところはdialogで
変数の抜き打ちテストしてましたが、logmesという選択肢もありますね。



KA

リンク

2012/9/3(Mon) 23:39:04|NO.49095

よく考えて見ましょう。

無限ループになるかどうかは、実行しないと分かりません。
でも実行した時は手遅れです。

REPEATのループなら適当なIF BREAKで回避出来ますが、GOTOのループ
などはソフト側で対処出来ません。



フワット・ベベ

リンク

2012/9/4(Tue) 00:42:05|NO.49097

すみません。言葉を間違えました。
『goto命令で、無限ループするとき』のつもりで書いていたもので。

goto命令で、wait命令、await命令がないとパソコンを占領されてしま
う事がないように、それについてのエラー機能が欲しいです。

聞いた話ではpicload命令も使いどころを間違うと、wait命令・await命令
がない無限ループよりも深刻な状態になるとか。



y.tack

リンク

2012/9/4(Tue) 00:43:49|NO.49098

gotoも似たようなマクロ定義すればいいですね

#define await1_goto(%1) await 1:goto %1 i=0 *begin logmes ""+i i++ await1_goto *begin



KA

リンク

2012/9/4(Tue) 06:42:06|NO.49106

実行しないと各種条件により無限ループに成るのかは分からない。
その各種条件を知っているのは、作った本人しか分からない。
ループの上限数も作った本人しか分からない。
その条件で無限ループに成る可能性があるのか調べるには実行するしかない。
(以上、無限ループ)

y.tack氏の様にするか、一定回数以上を無限と見なすのか、それも作った本人
にしか分からない。



f(出発前)

リンク

2012/9/4(Tue) 08:36:48|NO.49107

世の中には

「言いだしっぺの法則」と言う物も有る。

そしてHSPにも有志による修正が可能な環境がある。


・・・頑張って頂きたい。



YSR

リンク

2012/9/4(Tue) 17:01:34|NO.49113

まず押さえるべきは、「プログラムが無限ループかを有限時間で判定はできない」という事実。
(詳しくは「停止問題」でググろう)
そのを踏まえて考えると、
「画面の表示を何一つ変えない状態で10秒以上経つと割り込みで警告が入る」
機能を、実行時にON/OFF選べるようにするとかはどう?
または、ちょうどVSで言うところのDebugモードとReleaseモードみたいに、
「何時でも」



YSR

リンク

2012/9/4(Tue) 17:05:04|NO.49114

まず押さえるべきは、「プログラムが無限ループかを有限時間で判定はできない」という事実。
(詳しくは「停止問題」でググろう)
そのを踏まえて考えると、
「画面の表示を何一つ変えない状態で10秒以上経つと割り込みで警告が入る」
か、
「何時でも実行をワンキー(EscキーとかF9キーとか)で止められる」
機能を、実行時にON/OFF選べるようにするとかはどう?
後者のほうがインタープリタらしいかな?
ちょうど、VSで言うところのDebugモードとReleaseモードみたいに。
ステップ実行とか強制停止とかは、昔のBASIC風で初心者向けだと思うけどな。



YSR

リンク

2012/9/4(Tue) 17:07:00|NO.49115

なぜか連投してしまった……すみません。



@key

リンク

2012/9/4(Tue) 19:20:53|NO.49118

0で割ったときにエラー吐かないで0を返すようにするものがほしい・・・
誰か作ってくれないかなあ・・・



FunnyMaker

リンク

2012/9/4(Tue) 20:28:45|NO.49121

0除算の結果を「0」と返すような作りはマズいのではないかと...。
定義できない数を勝手に0とするのは危険でしょう。
それに、0除算が発生しているという事実に気づかないままコードを組み進めていってしまいかねません。



kamep

リンク

2012/9/4(Tue) 20:58:03|NO.49125

>0で割ったときにエラー吐かないで0を返すようにするものがほしい・・・
変数型を拡張するプラグインなら、
「0で割ったときに0を返す変数型」
という型を作れますよ。

需要があるなら、私の作ってるhspvar.dllに付けましょうか?

ただFunnyMakerさんの言っていることが問題ですが



にゃんちゃん

リンク

2012/9/4(Tue) 20:59:07|NO.49126

見つけるのが難しいとおもいますが、波括弧の閉じ忘れがたまにあり、どこの波括弧が閉じられていないのか分かるとうれしいと思っています。
主導で特定する方法は在りますが、ちょっとめんどくさいんですよね。
コードを最後までみて、波括弧の数が合わなかった場合、後ろから見ていって最初に閉じられていない波括弧を見つけたときに警告を出すとか。



YSR

リンク

2012/9/4(Tue) 22:26:26|NO.49129

>にゃんちゃんさん
「どこから閉じられていないか」表示機能は地味に必要ですよね。
なんで、

#波括弧が閉じられていません。 ???(5) : error 19 : 致命的なエラーです (5行目)
みたいな表示(最終行まで読んだけど無かったよ、的なエラー)しかできないのやら……。
まあ、「対応する括弧の表示」機能は、ちょっと上等なテキストエディタにはあったりしますが(秀丸のように)。



y.tack

リンク

2012/9/4(Tue) 22:33:27|NO.49130

>てれてれ氏
>picloadでイメージファイルが壊れている時にエラー吐かずにstatにでも
>結果代入してくれると嬉しいですね。

@key氏
>0で割ったときにエラー吐かないで0を返すようにするものがほしい・・・
>誰か作ってくれないかなあ・・・

実装するとしたらJAVAみたいに例外投げる形でしょうか
例外って普通の返り値と例外の返り値を返すみたいで
HSPも値返せるようになったので(大分昔になっちゃいましたね)
例外も返せると思うんですけど

ただJAVAはIDEで例外の入力サポートしてるので
例外を毎回手打ちするのはめんどくさいかも

後、変になったらすぐ止まるのは
一つの考え方で
予測不能な動作するのも止めるべきという
作者様の思想な気もします



レノス

リンク

2012/9/5(Wed) 00:46:48|NO.49133

私は #deffunc などのパラメーターが既に変数として使われていたときに
どれが使われていたのか知りたいです。数(特に local)が増えてくると地味に悩みます。

???(4) : error 26 : パラメーター引数名は使用されています (4行目) --> #deffunc test int k@m0,local a@m0,local b@m0,local c@m0



フワット・ベベ

リンク

2012/9/5(Wed) 01:01:14|NO.49134

プログラムのエラーは、実行した瞬間にエラーを見つけくれている。
それほど処理速度が早い、と思っていたのですが。
コメントを読んでいるとどうやら、そういう仕組みではないみたい
ですね。

パソコンが占領される状態は人間にとってはエラーなのですが、
プログラムの方はエラーだと思っていない、正常だ、という違い
があるのでしょうか。



y.tack

リンク

2012/9/5(Wed) 11:18:47|NO.49149

僕も割と無限ループしてフリーズするんですよね^^

僕は

while 1
とかよく考えず書いて、終了条件を間違えます

でも一発で終了条件を正しく書ける人ってHSP使わない気がします
なので考えてみたら無限ループ書いてもフリーズしないようにはして欲しいですね

無限ループしてもタスクマネージャー呼び出してタスク終了すればよいので
そんなに気にしなくもありますが
あんまり無限ループさせて強制終了させるとCPUにダメージがありそうでちょっと怖いです
無限ループさせて強制終了させても何らかのダメージはないものなのでしょうか?

考えたんですけど
comoptに何かパラメータつけたら
gotoとかwendとか関係なく100個処理したら(100じゃなくてもいいです)
await 1を実行するとかになってもいいと思います
await 1すると遅くなると思う人はcomoptしないって具合で



ヂオン

リンク

2012/9/5(Wed) 12:08:44|NO.49151

>>レノスさん
 自分的には、命令のパラメータには必ず末尾にアンダースコアを付けるようにしています。

 結局方法次第で、なんとかなるということかもしれません。
 
 



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