【症状】特定条件下で正しく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
手順3で「なにも・・・」と言われるはずが「+」と表示される、ということですよね?
そうでしたら再現しています。なでしこVer 1.531、VistaSP2です。
初回実行時のみ、ということですが、「ステップ実行」を押した後はどのボタンを押しても「+」が一つずつ表示されます。
0.最初に「ステップ実行」……以後どのボタンを押しても、「+」が1つだけ表示される。
1.「実行」→表示終了する前に「ステップアウト」……「なにもないけど。」が表示されず、「++++++.2」が最後まで表示される。
2.「ステップアウト」→「実行」→表示終了する前に「ステップアウト」……「なにもないけど。」が表示されて、表示処理が中断される。
3.「実行」→「ステップ実行」→「実行」→表示終了する前に「ステップアウト」……「なにもないけど。」が表示されず、「++++++.2」が最後まで表示される。
4.「ステップアウト」→「ステップ実行」→「実行」で表示終了を待った後、
・4-1.「実行」……「+」が1つだけ表示される。
・4-2.「ステップ実行」……「+」が1つだけ表示される。
・4-3.「ステップアウト」……「なにもないけど。」が表示される。
5.「実行」で表示終了を待った後、
・5-1.「実行」……「++++++.2」が最後まで表示される。
・5-2.「ステップ実行」……「+」が1つだけ表示される。
・5-3.「ステップアウト」……「なにもないけど。」が表示される。
6.「実行」で表示終了を待つ→「ステップ実行」→「ステップアウト」の後、
・6-1.「実行」……「++++++.2」が最後まで表示される。
・6-2.「ステップ実行」……「+」が1つだけ表示される。
・6-3.「ステップアウト」……「+」が1つだけ表示される。
こんな感じです。
何故か最後に「2」が表示されます。
バージョン:1.5322
最終更新日:2009/09/12
OS :Windows XP [5.1(2600:2)]
ひたすら「+」が延々と表示され続けました。
「2」は、表示されなかったです。
何を押しても「+」が表示。
バージョン:1.5322
OS:Windows VISTA Business SP2
コミットしておきました:
- GUI部品のイベントが正常に実行されるよう、参照の初期化を予め行うように変更。 (r202)(@387)
■原因レポート
1. GUI部品への参照(?) pgroup は、作成時に一旦 g で初期化する
(どの部品も同じ g で初期化される)
2. 初回イベント実行時、 pgroup を元にイベントハンドラを探す
3. これで見つからなかったら、まず pgroup を正しい値に初期化した上で再びイベントハンドラを探す
* ところが特定の状況下では、そもそもの「イベント発生元」が違うものになる(!?)
→ この原因が全く不明&再現状況も未だ謎
* そしてこの「イベント部品」のイベントハンドラが見つかるため、pgroupも書き替わらない
ということで、3で行っていた pgroup の初期化を1時点でやるように変更。
これで3が発生しなくなる。
----------------
皆さん再現報告ありがとうございます。
再現状況がもっと詳しく分かれば根っこの原因が分かるのではないかと思ったのですが、
結局なぜこの状況で正常にイベントが実行できないようになってしまうのか、
根本的な原因が分からないままですorz
バージョンアップ後、正常に実行できることの確認もよろしくお願いします<(_ _)>
では
version 1.5323になってこのスレで本来問題にされている、
「違う部品のイベントが実行される」という問題は
解消されたようです。
しかし、私の環境では何故か最後に「2」が表示されるんですよね。
先日、諸事情によりPCをリカバリするはめになってしまい、
リカバリ後も動作確認したのですが、余計な「2」が表示される
という状況は変わっていませんでした。
別件ですが、メール受信時削除もダメでした。
リカバリしても同じような現象が起こるということは、
私が使用しているPCとなでしこの間に
根本的に相性が悪い部分があるということかも知れませんね。
ちなみに
そのテキストは『++++++++++++++++++++++++++++++++++++++++++++++++++.』
の部分を変更すると、余計に表示される文字を別の文字に変えたり、
余計に表示される文字の数を変更することができます。
余計な「2」が表示されるのは、PCが悪いのではないと思います。
プログラム中に「対象=ARR[I]」「対象をコンソール追加」のように、
「対象」が使われているからです。
「対象」は反復命令で使用される予約語ですので、
なでしこ側により内容が書き換えられる可能性があります。
例えば、「K=ARR[I]」「Kをコンソール追加」のように、
別の変数にすれば問題ないと思います。
いえ、2が表示されるのは正しい挙動です。
説明が足りませんでしたが、このプログラムはBrainFuckと呼ばれる言語のインタプリタを
実装したもので、「+」はデバッグのために表示させていたものです。
(ステップ実行で1文字分実行、ステップアウトで最後まで実行.etc を実装したかった)
もともとの意図としては、「Hello, world!」のようなサンプルを動かしたかったのですが、
単純に文字出力の確認だけでいいのでデバッグのために「2」だけを出力させるようにしていました。
ちなみに、そういう訳なので、システム変数「対象」のあるなしは関係ありません。
恐らく「対象」の代わりに「K」にしても2は出力されます(というかされないと困る・・・)。
ざっと書いたプログラムだったので「対象」を使っていましたが、、、
実際、これが良くない書き方であることは事実ですね。
# せっかくちょうどコーディング規約草案を考えている所なので、
# 「ループ中にシステム変数やカウンタを書き変えない」を加えますf(^^;
粗茶さん、U Dさん、レスありがとうございました。
難しい話は私にはよく解りませんが(笑)、
「2」が表示されるのは問題なしということで了解しました。
……となると、後はメール受信時削除ですが、
メール受信後の挙動もかなりおかしい感じなんですよね……。