なでしこを明後日の方向に

日本語プログラム言語なでしこを応援しています

なでしこの質問掲示板で気になった質問

なでしこの質問掲示板で気になる質問がありました

日本語プログラミング言語なでしこ公式掲示板

なでしこ1で、ボタンを配列で作成したのですが、クリックした時の挙動が変です
どのボタンが押されたかをタグで認識させたいのですが、以下のプログラムでB【0】のタグが1となり、B【8】をクリックするとエラーになります
このプログラム、どこがおかしいのでしょうか?ご教示お願いします(バージョン 1.588です)

ID0から8まで繰り返す //…1行目
  B【ID】ボタンして作成。
  B【ID】Y=25*ID
  B【ID】タグID
  B【ID】テキストID
  B【ID】クリックした時
    「{B【ID】→タグ}」ボタン押した時 //…7行目
ここまで●ボタン押した時(IDで) //…10行目
    「{ID}を押しました」言う。

これ系は見たことがあったので、7行目の「B【ID】→タグ」を「自身→タグ」にすれば解決とすぐわかりました。

ただ、質問文のなかで

「プログラムでB【0】のタグが1となり、B【8】をクリックするとエラーになります」

とあります。
あれ、思ってたのと違う?

気になった理由

まずプログラムの構造ですが、変数「ID」が3つ登場しています。

 ID0から8まで繰り返す //…1行目
 「{B【ID】→タグ}」ボタン押した時 //…7行目
 ●ボタン押した時(IDで) //…10行目

1行目の変数IDはグローバル変数です。
10行目の変数IDはローカル変数です。
そして7行目の変数IDが問題です。

7行目のIDはグローバル変数で、ID0から8まで繰り返す をしたので「ID=8」になっていると思いました。

「ID=8」だったとすると
「{B【ID】→タグ}」ボタン押した時 の部分は
「{B【8】→タグ}」ボタン押した時 となり、どのボタンも8と同じ挙動するはずだと思いました。

実際にプログラムを動かすと、B【0】のボタンはB【1】→タグを参照し、「1を押しました」と表示されます。
B【8】のボタンはB【9】→タグを参照し、エラーとなります。

思ったのと違う!

IDが指すもの

クリックした時は~の中で指している「ID」は、ボタンのメンバ変数の「ID」だったのです。
「ボタンのID」には作った部品の番号が入るようです。

そして「{B【ID】→タグ}」ボタン押した時 のIDは、自身ID を指していたということです。

変数名が同じ場合、ローカル変数、グループのメンバ、グローバル変数の順で探しに行く。
グループのメンバと同じ名前のグローバル変数は使わないほうがよいですね。