https://hsp.tv/play/pforum.php?mode=pastwch&num=70312
もしかしたら以前私が提起した事(過去ログにあります)が原因ではないかと思いました。
それはif文の中身が大きくなりすぎると、間違った場所へジャンプしてしまうというものです。
以下のコードを実行すると、予想に反して
「aaa」
と表示されます。
1行目if(0){
2行目 mes "aaa"
3行目 stop
4行目 stop
5行目 stop
⋮ ⋮
10922行目 stop
10923行目 stop
10924行目 stop
10925行目 }
10926行目 mes "abc"
一方でstop命令を一つコメントアウトした以下のコードを実行すると、「abc」
と正しく表示されます。
1行目if(0){
2行目 mes "aaa"
3行目 // stop
4行目 stop
5行目 stop
⋮ ⋮
10922行目 stop
10923行目 stop
10924行目 stop
10925行目 }
10926行目 mes "abc"
これはHSPの中間コードにおいて、if命令は偽のときのコードセグメントのジャンプ先を16bitの相対オフセット値で保持しているのですが、
ifの中に多量の命令があると、16bitでは収まらずオーバーフローしてしまい本来は10926行目にジャンプしなければならないところを2行目にジャンプしてしまいます。
相対オフセット値を32bitとかで持てば大丈夫でしょうが、axファイルのフォーマットが変更するのは影響範囲が広すぎるように思います。
下記のようにすればとりあえず問題はでません。
if(式){}else{goto *b}
〜真の処理〜
goto *a
*b
〜偽の処理〜
*a
axファイルフォーマットを変更するか、ヘルプなどでif文の注意書きを追加するなどしたほうが良いかなと思います。
検証用コードはこちらです。
https://github.com/takazin11de/if_test/blob/main/it_test.hsp

