- ベストアンサー
C#のWindowsアプリケーションでボタン押下時の配列処理について
- C#のWindowsアプリケーションでボタンを押すと、oという配列が生成されます。
- 他のボタンを押すと、oの値を引いてくることができます。
- しかし、未確定の配列の大きさを他のイベントで使う場合、どのような処理が必要でしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>他のボタンを押すとdouble[, ,] o;に入力した値はNULLに戻ってしまいます。 フィールドに記述した内容と、 それぞれのボタンのイベントハンドラに記述した内容はどんなのですか? public partial class Form1 : Form { double[,,] o; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { o = new double[2,3,4]; o[0, 0, 0] = 1.234; } private void button2_Click(object sender, EventArgs e) { if (o != null) o[0, 0, 0] += 0.111; } } これで、とりあえずbutton1を「1回」クリックした後で、button2をクリックしていくとo[0,0,0]は0.111ずつ増えていきますが。 # ブレークポイント設定して、ステップ実行で確認。 なお、その後button1をクリックすると先に確保していた分は破棄され、新たにnewで確保したモノに置き換わります。 # 破棄した分のメモリは後で回収されることになります。 再確保させないためには… if(o == null) o = new double[2,3,4]; ってな感じになるでしょうかね。 button1_Click()でnewしている箇所を double[,,] o = new double[2,3,4]; としてはダメですよ。 この場合は「フィールドのo」ではなく「ローカル変数のo」を作成しているだけですから、イベントハンドラから抜けると「ローカル変数のo」は破棄されます。
その他の回答 (2)
- Wr5
- ベストアンサー率53% (2173/4061)
>newして割り当てた場合、フォームのフィールドとイベントパンドラ内で2重の定義になり、 >既にスコープされていると表示されてしまいました。 フィールドには double[, ,] o; だけ。 コンストラクタでもnewしないでおきます。 # o = null;くらいはいいかもしれませんが。 で、 public void button3_Click()内では、 o = new double[a, 50,b]; とします。
お礼
ありがとうございます。 それも行ったのですが。 他のボタンを押すとdouble[, ,] o;に入力した値はNULLに戻ってしまいます。
- Wr5
- ベストアンサー率53% (2173/4061)
>このイベントで発生するoという配列を戻す どこに戻すのでしょうか? 掲示されたコードだと、イベントハンドラの呼び出し元に返していますが、呼び出し元が戻り値としてソレを要求していますか? >public void button3_Click(object sender, EventArgs e) なので戻り値はなしのハズですが……。 # returnの行で警告かエラーになっていませんか? おそらくフォームでしょうから、フォームのフィールドにdouble[, ,] o;を加えて、イベントハンドラ内(button3_Click()内)でnewして割り当てればよいかと。 >他のボタンを押した時にoの値を引いてくる。 では、oがnullかどうか判定してから処理するようにします。
お礼
ありがとうございます。 newして割り当てた場合、フォームのフィールドとイベントパンドラ内で2重の定義になり、 既にスコープされていると表示されてしまいました。 どうしたら解決できるのでしょうか? 調べているのですが、わかりません。追加の質問になり申し訳ありません。可能であれば教えてください。
補足
newして割り当てるとはどういうことでしょうか?
お礼
ありがとうございます。うまくいきました。 本当にありがとうございます。 ずっと悩んでたことがやっと解決できました。 ミスはご指摘の下記内容でした。 button1_Click()でnewしている箇所を double[,,] o = new double[2,3,4]; としてはダメですよ。 この場合は「フィールドのo」ではなく「ローカル変数のo」を作成しているだけですから、イベントハンドラから抜けると「ローカル変数のo」は破棄されます