10秒目をつむったら…

今、以下のような流れを考えています

C#のwindowsアプリケーションでフォーム中のボタンを押す。

このイベントで発生するoという配列を戻す

他のボタンを押した時にoの値を引いてくる。

しかしながら、うまく処理できていません。

配列の大きさが未確定のoという配列を戻して他のイベントで使うにはどういう処理をしたらいいのでしょうか?
わかるかたがいましたら、教えていただけないでしょうか?
よろしくお願いします。
参考までに考えているプログラムを下に示します。


記述中のプログラム(voidをdoubleに変更してもうまくいきませんでした。
public void button3_Click(object sender, EventArgs e)
{
      int a;
int b;

途中省略

      double[, ,] o = new double[a, 50,b];       

途中省略

return o

A 回答 (3件)

>このイベントで発生するoという配列を戻す



どこに戻すのでしょうか?
掲示されたコードだと、イベントハンドラの呼び出し元に返していますが、呼び出し元が戻り値としてソレを要求していますか?

>public void button3_Click(object sender, EventArgs e)

なので戻り値はなしのハズですが……。
# returnの行で警告かエラーになっていませんか?


おそらくフォームでしょうから、フォームのフィールドにdouble[, ,] o;を加えて、イベントハンドラ内(button3_Click()内)でnewして割り当てればよいかと。

>他のボタンを押した時にoの値を引いてくる。

では、oがnullかどうか判定してから処理するようにします。

この回答への補足

newして割り当てるとはどういうことでしょうか?

補足日時:2012/09/24 22:05
    • good
    • 0
この回答へのお礼

ありがとうございます。

newして割り当てた場合、フォームのフィールドとイベントパンドラ内で2重の定義になり、
既にスコープされていると表示されてしまいました。

どうしたら解決できるのでしょうか?

調べているのですが、わかりません。追加の質問になり申し訳ありません。可能であれば教えてください。

お礼日時:2012/09/24 21:45

>newして割り当てた場合、フォームのフィールドとイベントパンドラ内で2重の定義になり、


>既にスコープされていると表示されてしまいました。

フィールドには
double[, ,] o;
だけ。
コンストラクタでもnewしないでおきます。
# o = null;くらいはいいかもしれませんが。

で、
public void button3_Click()内では、
o = new double[a, 50,b];
とします。
    • good
    • 0
この回答へのお礼

ありがとうございます。

それも行ったのですが。
他のボタンを押すとdouble[, ,] o;に入力した値はNULLに戻ってしまいます。

お礼日時:2012/09/24 23:45

>他のボタンを押すと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」は破棄されます。
    • good
    • 0
この回答へのお礼

ありがとうございます。うまくいきました。
本当にありがとうございます。
ずっと悩んでたことがやっと解決できました。
ミスはご指摘の下記内容でした。

button1_Click()でnewしている箇所を
double[,,] o = new double[2,3,4];
としてはダメですよ。
この場合は「フィールドのo」ではなく「ローカル変数のo」を作成しているだけですから、イベントハンドラから抜けると「ローカル変数のo」は破棄されます

お礼日時:2012/09/25 21:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!