【症状】特定条件下で正しくGUI部品のイベントが実行されず、違う部品のイベントが実行される
【要望】正しいイベントが実行されるように。
【バージョン】1.5322
【その他】
一応既に原因の特定と不具合の修正はできたと思うのですが、
元々のコードがなぜこうなっていたのか分からないので、コミット少し保留。
もうちょっと調べます。
できれば、他の方も再現するかどうか報告お願いします。(慎重に対処したいので)
【再現方法】
再現条件の最小化に失敗したので、長いけれどプログラム全文で載せときます。
実行したら、
1. ステップ実行をクリック
2. ステップアウトをクリック
3. 「なにも・・・」と言われるはずなのに、ステップ実行クリック時が実行される
再現するのは、ループ処理中(秒待つ中?)かつ初回クリック時のようですが、詳しくは不明
(初回クリックの説明はつくが、なぜループ処理中なのか説明がつかないf(^^; )
#-----------------------------------
# ここから最後まで #----------------
ウェイトとは変数
ウェイトは~0.1秒待つ
!左限界幅=160
!ASCII表=『
!"#$%&'()*+,-./
0123456789:;<=>?
@ABCDEFGHIJKLMNO
PQRSTUVWXYZ[\]^_
`abcdefghijklmno
pqrstuvwxyz{|}~
』
aとは配列
kとは整数
sとは整数
!NORMAL =$00
!LOOP_BEGIN=$01
!LOOP_END =$02
!LOOP_BODY =$04
!インクリメント=`+`
!デクリメント =`-`
!ポインタ後進 =`<`
!ポインタ前進 =`>`
!ループ開始 =`[`
!ループ終了 =`]`
!アスキー出力 =`.`
処理とはハッシュ
処理@インクリメント=~ a[k]=a[k]+1
処理@デクリメント =~ a[k]=a[k]-1
処理@ポインタ後進 =~ k=k-1
処理@ポインタ前進 =~ k=k+1
処理@ループ開始 =~ s=LOOP_BEGIN
処理@ループ終了 =~ s=LOOP_END
処理@アスキー出力 =~ PUTCHR(a[k])
●PUTCHR(N)
CHR(N)をコンソール追加
ステップ実行ハンドラとは変数
編集台とはパネル
そのレイアウトは『全体』
BFEとはTエディタ
その親部品は編集台
そのレイアウトは『全体』
その編集はOK
そのテキストは『++++++++++++++++++++++++++++++++++++++++++++++++++.』
コンソールとはメモ
その親部品は編集台
そのレイアウトは『下』
その文字色は非アクティブ色
その背景色は黒色
その編集はオフ
その折り返しは有効
/*
作業台とはパネル
そのレイアウトは『左』
その幅は左限界幅
プリンとはスプリッタ
その変更した時は~
もし作業台の幅<左限界幅ならば
作業台の幅=左限界幅
マクロ箱とはグループボックス
そのテキストは『マクロ』
その親部品は作業台
そのレイアウトは『全体』
マクロとはコンボ
その親部品はマクロ箱
そのレイアウトは『上』
マクロエディタとはメモ
その親部品はマクロ箱
そのレイアウトは『全体』
実行箱とはグループボックス
そのテキストは『実行』
#その親部品は作業台
そのレイアウトは『下』
その高さは120
# */
0,0へ移動
実行とはボタン
#その親部品は実行箱
そのレイアウトは『上』
これがクリックされた時は~
最適化実行処理
ステップ実行とはボタン
#ステップ実行の親部品は実行箱
ステップ実行のレイアウトは『上』
実行フラグはオフ
ステップ実行がクリックされた時は~
一文字ずつ実行処理
ステップアウトとはボタン
#ステップアウトの親部品は実行箱
ステップアウトのレイアウトは『上』
ステップアウトがクリックされた時は~
「なにもないけど。」と言う
/*
カーソル行迄とはボタン
そのテキストは『カーソルまで実行』
その親部品は実行箱
そのレイアウトは『上』
ASCII箱とはグループボックス
そのテキストは『ASCII』
その親部品は作業台
そのHは150
そのレイアウトは『下』
ASCII一覧とはTエディタ
これについて
親部品はASCII箱
レイアウトは『全体』
編集はNG
テキストはASCII表
サイズ。
レイアウトは空
サイズはそれ
W=W+50;X=X-30
H=H+20
# */
●最適化実行処理
もしBFEの編集がOKならば
実行コンテクスト初期化
「Execute [NORMAL MODE]{~}」をコンソール追加
ステップ実行ハンドラは空
共通実行処理
違えば
実行フラグはオフ
ウェイト
ステップ実行ハンドラは空
●一文字ずつ実行処理
もしBFEの編集がOKならば
実行コンテクスト初期化
「Execute [BY STEP]{~}」をコンソール追加
ステップ実行ハンドラ\0は~
実行フラグはオン
ステップ実行ハンドラ\1は~
(実行フラグ)の間
ウェイト
# 実行フラグがオフになるまで待機
共通実行処理
違えば
実行フラグはオフ
●共通実行処理
BFEの編集はNG
BFEをBrainFuck実行
BFEの編集はOK
●実行コンテクスト初期化
コンソールは空
a=空#を文字列分解)
●BrainFuck実行({文字列}STRを)
ARRとは文字列=STRを文字列分解
Lとは整数=ARRの要素数
Iとは整数
深さとは整数
ループマップとは配列
改行をコンソール追加
(I<L)の間
ステップ実行ハンドラ\0。# 他のボタンを押した時の再処理?を防ぐ
ステップ実行ハンドラ\1。# ステップ実行時は、ここで処理を待機させる
対象=ARR[I]
対象をコンソール追加
処理@(対象)
sで条件分岐
LOOP_BEGINならば
もしa[k]が0ならば
ARRでIを深さまでループブレイク
s=LOOP_BREAK
違えば
ループマップ[深さ]=I
深さ=深さ+1
s=LOOOP_BODY
LOOP_ENDならば
もしa[k]が0ならば
深さ=深さ-1
もし深さ>0ならばs=LOOP_BODY
違えばs=NORMAL
違えば
I=ループマップ[深さ]
I=I+1
ウェイト
「{~}Finished」をコンソール追加
# 位置Iから開始して、ARR[I]が目標深度でループ終了になるまで進める。
●ループブレイク(ARRで{参照渡し}Iを目標深度まで)
現在深度とは整数=目標深度+1
(現在深度>目標深度)の間
I=I+1
ARR[I]で条件分岐
ループ開始ならば現在深度=現在深度+1
ループ終了ならば現在深度=現在深度-1
●コンソール追加(Sを)
コンソール=コンソール&S