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


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0730
真夏のストーブif文の数の制限について8解決


真夏のストーブ

リンク

2015/7/30(Thu) 05:55:01|NO.70312

自分の書いていたプログラムが、それまでは正常に動作するのに、
ある特定の箇所にif文を投入すると
「動作を停止しました」「if文のすり抜け」等が発生して困っています。

無意味なif文(if(a!0)&(a=0):a=0)への置き換え・追加やif文の移動等を試した結果、
どうやら「if文の中のif文」に関して何らかの制限があるらしいことがわかりました。
if文のネスト数も制限に関わっている可能性がありそうですが、
いずれにせよif文の中のif文に制限があるのはどうやら確からしいです。

HSP3における「ifの制限」について、どこかに記述があるなど無いでしょうか?
ご回答をよろしくお願いします。



この記事に返信する


ミント

リンク

2015/7/30(Thu) 07:54:01|NO.70313

ifの数に制限はないですよ〜

if
if
if
if
とかでも全然問題ないです。


if文がすり抜けてしまう場合は、条件が満たされていないことが原因なので、
すり抜けているif文だけにして実行すると、問題が見えてくる時があります。

if文の中身に問題があっても実行される場合があります。
そのif文が実行されたときエラーになる場合もあります。
例えば配列が置かれてなかった時、文字列数字列の置き換えとか。

後は}の場所が悪い場合もあります。
とりあえず、新規でプログラム作って、そのif文だけを実行すれば問題解決できると思います



zakki

リンク

2015/7/30(Thu) 09:57:50|NO.70316

一応コンパイルには128段の制限あります

http://dev.onionsoft.net/trac/openhsp/browser/trunk/hspcmp/token.h#L49



真夏のストーブ

リンク

2015/7/30(Thu) 15:38:03|NO.70327

御二方ご回答ありがとうございます。

> if文がすり抜けてしまう場合は、条件が満たされていないことが原因
言葉足らずで申し訳ありません。「if文のすりぬけ」とは、
極端な話が絶対に真にならない「if(a!0)&(a=0):a=0」が
真扱いされてa=0の代入が実行されるというものです。
実際にdebug windowで処理を一行一行追いかけていったら、
本来ならば偽のところを真扱いされてすり抜けられてしまったのです。

> 後は}の場所が悪い場合もあります
これの可能性も考えたのですが、「if(a!0)&(a=0):a=0」という文章を挿入しただけで
停止エラーが起きたり、この文章を撤去しただけでエラーが治るので
その可能性は低いと思われます。
なお、aはプログラムに関与していない適当な変数です。

> 一応コンパイルには128段の制限
一応制限はあるんですね。たださすがに128段まではないだろうし、
{}を使わない文章を挿入してエラーが起こるようなのでまだ別の要因があるはずです。


引き続き回答を募集しています。ご存知でしたらご回答をお願いします。



KA

リンク

2015/7/30(Thu) 18:02:28|NO.70337

>>ある特定の箇所にif文を投入すると
>>「動作を停止しました」「if文のすり抜け」等が発生して

>>{}を使わない文章を挿入してエラーが起こる・・・


{}を使えば解決するのなら書き方の問題が考えられます。

問題が発生する最小限のスクリプトを貼りましょう。
その過程でミスが判ることが多々ありますよ。



真夏のストーブ

リンク

2015/7/30(Thu) 23:22:15|NO.70358

ご回答ありがとうございます。
> {}を使えば解決する
しません。

> 問題が発生する最小限のスクリプトを貼りましょう
最小限を貼るなら「if(a!0)&(a=0):a=0」です。
当然単体でエラーが起こらないことは確認済みです。


少々論点からずれているようですので。
私が知りたいのは「if文の中のif文に何かしらの制限があるはずだ」ということです。

普通のスクリプトなら、「if(a!0)&(a=0):a=0」という一行を加えただけで
「動作が停止しました」(HSPエラーではない)になることは絶対ありえないことは
容易に想像できるはずです。
また、これを加えたからエラーになるとしても
これを削除するだけでエラーが解決することも考えにくいでしょう。
また、これを挿入する場所を変えることでエラーが起こる理由もわかりません。

しかし、これらが現実として起こっているので、これから判断できることとしては、
「if文の中のif文に何かしら制限があるのではないか?」ということです。
解決するだけならif文をどこかに移動させれば良いだけです。
しかしこれはあくまで対症療法的であり、根本的な解決にならないと考えた次第です。

もし、
> 一応コンパイルには128段の制限
これ以外の条件が本当になければ対症療法的な処置でプログラムを切り貼りするまでですが、
他にもあるのではないか?と考えている次第です。

私が最初に立てた文章に不足がありましたことはお詫びいたします。
引き続き、回答をお待ちしております。



スペース

リンク

2015/7/30(Thu) 23:30:19|NO.70359

>> 問題が発生する最小限のスクリプトを貼りましょう
>最小限を貼るなら「if(a!0)&(a=0):a=0」です。
>当然単体でエラーが起こらないことは確認済みです。

揚げ足を取るようで申し訳ないのですが、
「問題が発生する最小限のスクリプト」と書いていますよね。
問題が発生しないスクリプトを貼っても意味が無いのでは?



zakki

リンク

2015/7/30(Thu) 23:58:06|NO.70360

理想的には if(a!0)&(a=0):a=0 は何もしませんが、実際はスタックの増減があるので、
例えば次のような病んだケースではif文の有無で挙動が変わります。

他の暗黙の制限や何かのバグでスタックやヒープ破壊おきてると動作変わる可能性はあります。
実行してエラーになる小さいコード片あると何か分かるかもです。


i = 0 *foo i+ pos (i \ 50) * 30, (i / 50) * 30 mes i if i < 512 : gosub *foo mes "A" if(a!0)&(a=0):a=0 mes "B"



真夏のストーブ

リンク

2015/7/31(Fri) 00:09:50|NO.70361

> 他の暗黙の制限や何かのバグでスタックやヒープ破壊おきてると動作変わる可能性はあります
最も考えられそうな理由なので、この回答を以って解決としたいと思います。

短いコードを載せられればそれにこしたことはないのですが、
コードを短くすればエラーが起こらなくなるので載せることが出来ませんでした。
if(a!0)&(a=0):a=0を削除するだけで起こらなくなるエラーなのですから。

実際に起こったエラーとしてはエラー29ではありませんが、
これに類するエラーがどこかで起こっているのだろうと考えられそうです。

ご回答ありがとうございました。



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