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


HSPTV!掲示板


未解決 解決 停止 削除要請

2025
1024
tkznif文の中身大きさの限界0解決


tkzn

リンク

2025/10/24(Fri) 12:59:39|NO.104118

下記リンクのif文の問題について、
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



この記事に返信する


記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.104118への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

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