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


HSPTV!掲示板


未解決 解決 停止 削除要請

2007
0925
DripHSP3デバッガがエラー行を間違う不具合について15解決


Drip

リンク

2007/9/25(Tue) 00:33:50|NO.11190

Dripです。

 こんにちは。
HSPスクリプトエディタからスクリプトを実行した際、途中でエラーが発生すると
エラー行が報告されますが、そのエラー行が数行ずれたり、とんでもない位置を指摘いていたり、
デバッグに非常に手を焼いています。
 エラー発生の要因となった変数名のひとつでもわかれば、デバッグ速度は飛躍的に上がるのですが、
HSP3ではそれすらも判らないので、せめてエラー行は正確に報告してもらいたいものです;

 具体的には以下のような状態が度々発生します。(HSP3.1最新版で実行。)
(意図的に0除算でエラーさせましたが、エラー行がとんでもない位置にずれています。)
http://briefcase.yahoo.co.jp/bc/hsp_dripside/lst?.dir=/fe62&.src=bc&.view=

 長いプログラムを書いているといつの間にかずれているので、なかなか原因を特定する事ができません。
HSP3が公開されてからかなり経ちますが、公開当初から幾度も報告のあったこの不具合が
修正されていないのは問題と思い、このスレッドにてエラー行のずれる原因と思しきものを
募集したいと思います。
些細な事でも問題に関与する情報がありましたら、書き込んでいただきたく思います。

最後までお読みくださりありがとうございました。



この記事に返信する


FUJI

リンク

2007/9/25(Tue) 07:01:20|NO.11191

エラー行のずれる原因と思しきもの、ということで。

#define macro %c mes 1 / 0 macro
マクロで%cを使うとずれるようです。



FUJI

リンク

2007/9/25(Tue) 07:05:37|NO.11192

あと、不具合ではないのですが、
ラベルが見つからないときのエラーはそのラベルを参照しているところをエラー行にしてほしいものです。

goto *label
たとえばこの場合 2 行目ではなく、見つからないラベルを参照している 1 行目をエラーになってほしいです。



eller

リンク

2007/9/25(Tue) 16:56:09|NO.11201

Dripさん、素晴らしい提案をありがとうございます。微力ながら報告させていただきます。

複数行文字列を利用してもずれてしまうようです。
例えば以下のスクリプトでは、4行目でエラーが出るはずですが「Error 19 in line 3」と表示されます。
複数行文字列内での改行はカウントされていないようです。

#define error mes 1 / 0 // 1st line a={" // 2nd line "} // 3rd line error // 4th line



Drip

リンク

2007/9/25(Tue) 19:06:26|NO.11203

Dripです。

 早速の書き込みありがとうございます。
FUJIさんのエラー例ですが、なるほど、私は使った事がありませんが%cの指定で確かに
エラー行がずれますね。
あとこの問題とは直接関係ありませんが、ヘルプブラウザの#define の %cの使用例を実行した時、
エラーが起こるようですが、これはおにたまさんの意図しない動きをしているということなのでしょうか‥
ちょっと怪しいですね。
 ラベルエラーの行がスクリプトの末行になってしまう問題もそうですが、変数に関与するエラーでは
行だけでなく、その変数名も教えてもらいたいものです;;長い式に組み込まれた配列変数を調べるのは
かなり大変なので;;

 次にズバリな的を射たellerさんのエラー例なのですが、
まさに私のケースはこれが原因だったようです;プログラムを調べた所、ぽつぽつと{""}の文法が
使われており、改行文字列が指定されていました。
下手するととんでもない所までエラー行がすっとんでいきますね;
早く修正される事を切に願います。

 ありがとうございました。
他にもエラー行がずれる問題に関連する情報をお持ちの方がいらっしゃましたら
教えていただきたく思います。



ANTARES

リンク

2007/9/27(Thu) 00:36:03|NO.11218

/*〜*/が複数行に渡っている場合もずれます。
#if 0〜#endifに置き換えられる場合は置き換えると正しい行番号になります。



Drip

リンク

2007/9/27(Thu) 02:28:32|NO.11225

おや?
こちらの環境では複数行コメントがあってもエラー行に間違いはありませんが‥

/* コメント コメント */ x=0 y=3/x
参考までに宜しければエラーするプログラムを
見せていただけると助かります。



ANTARES

リンク

2007/9/27(Thu) 03:02:15|NO.11229

「#Error 6 in line 12」と表示されます。
正しくは「#Error 6 in line 15」です。
ちなみにスクリプトはHSP Wikiのエラー解説にあったものを
少し修正しています。


;hsp3.1 /* #module #deffunc test str text return strmid(text,0,1) ; Error #23 "変数名が指定されていません" #global */ a = "test string" gosub *l_sub mes refstr stop *l_sub ;text=a return strmid(text,0,1)



eller

リンク

2007/9/27(Thu) 07:30:19|NO.11232

複数行コメント内に半角シャープがあると問題が生じるようです。

/* #この行のシャープを削除するか、直前に(空白を除く)他の文字列を挿入すると正常に動作します*/ dialog str( __LINE__ ) + "行目と判断(実際には3行目)" : end
正確に分かったわけではありませんが、
・ コメント内行頭に半角シャープがあると、そこで改行したとみなされている
・ その半角シャープ以降、コメント内の改行は無視されている
ような気がします。以下検証スクリプトです。

/*(1行目ここまでと判断) ここの行末はカウントされる(2行目ここまでと判断) #(3行目ここまでと判断?)ここの行末はカウントされない ここの行末もカウントされない ... ... ... ... ここの行末はカウントされる(改行がコメント外にあるため)*/ //(4行目ここまでと判断) dialog str( __LINE__ ) + "行目と判断(実際には10行目)" : end //(5行目ここまでと判断)



Drip

リンク

2007/9/27(Thu) 18:55:05|NO.11233

 なんと、これは凄い発見ですね!
複数行コメントの中で#から始まる行がある時のみ問題が発生するとは‥気付きませんでした。

 ご報告してくださったANTARESさん、詳しい検証をしてくださったellerさん、
本当にありがとうございました。
私ももう少しこの問題について色々調べてみようと思います。
他にも何か情報をお持ちの方がいらっしゃいましたら是非書き込んでいただきたく思います。



Drip

リンク

2007/9/27(Thu) 22:05:26|NO.11236

度々失礼します。

 私もひとつ発見しました。
とりあえず次のスクリプトをHSP3.1最新版で実行すると、エラー行がずれてしまいます。

#define sample(%1) a=int(%1/1):a=int(%1/1):\ if a>=0 & a>=0 & a<0 & a<0:{\ if a>=0 & a>=0 & a<0 & a<0:{\ if a(0)<%1 & a(0)>=%1:{\ if a(0)=0:{\ a=1\ }else{a=0}\ }else{a=0}\ }else{a=0}\ }else{a=0} if a(0)=0:x=0,0:sample x(0):if a!1:a(0)=1 x=3/0 //ここでエラー。デバッグで報告された行と実際の行を比較してみてください。
が、なぜずれるのか、まるで規則性を見出す事ができません。
スクリプトを少しいじっただけでエラー行が正しくなります。
例えば比較する式をひとつ減らすだけでもエラー行が正しくなります。

ちなみに下のスクリプトは上のスクリプトから\を抜き、ifを全て{}で囲ったものです。
やっぱりずれます。(スレッドが横に伸びてしまってすみません。)

#define sample(%1) a=int(%1/1):a=int(%1/1):if a>=0 & a>=0 & a<0 & a<0:{if a>=0 & a>=0 & a<0 & a<0:{if a(0)<%1 & a(0)>=%1:{if a(0)=0:{a=1}else{a=0}}else{a=0}}else{a=0}}else{a=0} if a(0)=0:{x=0,0:sample x(0):if a!1:{a(0)=1}} x=3/0 //ここでエラー。デバッグで報告された行と実際の行を比較してみてください。
‥謎です。
このパズルが解けた方、いらっしゃいましたら是非ご報告願います。



eller

リンク

2007/9/27(Thu) 22:56:37|NO.11237

……とりあえず、マルチステートメントで1行に42個以上の代入文を詰め込むとエラー行がずれる(その行の改行をカウントしない?)ことは割り出せました。
__LINE__マクロはずれていないのが、少し不思議ではありますが……。
今までのエラーとは少しタイプが異なるのかもしれません。

#define sample(%1) %1=1:%1=2:%1=3:%1=4:%1=5:%1=6:%1=7:%1=8:%1=9:%1=10:\ %1=11:%1=12:%1=13:%1=14:%1=15:%1=16:%1=17:%1=18:%1=19:%1=20:%1=21:%1=22:\ %1=23:%1=24:%1=25:%1=26:%1=27:%1=28:%1=29:%1=30:%1=31:%1=32:%1=33:%1=34:\ %1=35:%1=36:%1=37:%1=38:%1=39:%1=40:%1=41:%1=42 sample a mes str( __LINE__ ) + "行目と判断" : mes 1 / 0



FUJI

リンク

2007/9/27(Thu) 23:00:45|NO.11238

Dripさんのコードですが、
マクロを展開した状態でも同じ現象が起こりました。
ゼロ除算でエラーを起こしている行の先頭に' mes __line__: ' を入れると、この表示の方は正しい行数でした。
'#cmpopt ppout 1'で出力したプリプロセッサ済みのファイルには問題はないので、
問題は、デバッグ時の行数カウントの方にあると思います。



FUJI

リンク

2007/9/28(Fri) 00:00:25|NO.11239

>マルチステートメントで1行に42個以上の代入文を詰め込むと
代入でなくとも発生しました。
多分、1行の中間コードサイズが一定以上だと駄目なんじゃないかなぁとか勝手に予測。

a=1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1 mes str( __LINE__ ) + "行目と判断" : mes 1 / 0
これでも発生しますし。



Drip

リンク

2007/9/28(Fri) 00:31:55|NO.11240

ellerさん、FUJIさん、検証ありがとうございます。
こちらではまだ懲りずにコードばかり試行錯誤してました;
まさか“一行に書かれた式の数”がエラー行のずれる原因とは
思いもしませんでした;;

スレッドが長くなってきたのでここまでで判ったことを
ひとまずまとめたいと思います。

■マクロで%cを使用するとエラー行がずれる。

#define macro %c mes 1 / 0 macro //エラー行を間違うエラー
■文字列の指定で{" "}の書式を使って複数行書いた場合にエラー行がずれる。

a={"複数行文字列 複数行文字列 複数行文字列"} x=3/0 //エラー行を間違うエラー
■コメントで/* */の書式を使って複数行書いた場合、#から始まる行があると複雑にエラー行がずれる。

/*(1行目ここまでと判断) ここの行末はカウントされる(2行目ここまでと判断) #(3行目ここまでと判断?)ここの行末はカウントされない ここの行末もカウントされない ... ... ... ... ここの行末はカウントされる(改行がコメント外にあるため)*/ //(4行目ここまでと判断) dialog str( __LINE__ ) + "行目と判断(実際には10行目)" : end //(5行目ここまでと判断) //ellerさんの検証より抜粋
■1行に一定以上の式が発生するとエラー行がずれるよう。

 ・例1

#define sample(%1) %1=1:%1=2:%1=3:%1=4:%1=5:%1=6:%1=7:%1=8:%1=9:%1=10:\ %1=11:%1=12:%1=13:%1=14:%1=15:%1=16:%1=17:%1=18:%1=19:%1=20:%1=21:%1=22:\ %1=23:%1=24:%1=25:%1=26:%1=27:%1=28:%1=29:%1=30:%1=31:%1=32:%1=33:%1=34:\ %1=35:%1=36:%1=37:%1=38:%1=39:%1=40:%1=41:%1=42 sample a x=3/0 //エラー行を間違うエラー
 ・例2

a=1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1 x=3/0 //エラー行を間違うエラー //FUJIさんの検証より抜粋 //ゼロ除算でエラーを起こしている行の先頭に' mes __line__: ' を入れると、この表示の方は正しい行数でした。 //'#cmpopt ppout 1'で出力したプリプロセッサ済みのファイルには問題はないので、 //問題は、デバッグ時の行数カウントの方にあると思います。
の4パターンですね。
ここまでのエラー行がずれる検証で何かお気づきの方、他のずれるパターンをご存知の方、
いらっしゃいましたら書き込みをお願いします。



n

リンク

2007/10/2(Tue) 17:05:26|NO.11346

バグトラ行けば?今更騒ぎ立てる問題ではない。
だいたい正確なエラー行を教えてもらわれなければ
バグ
の原因が取り除けないっていうデバッグの仕方に問題が。



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