• ベストアンサー
  • 困ってます

C#でオブジェクトの配列を使う

開発環境はMicrofoft visual stdio 2005 で開発言語はC#を使い、Windousアプリケーションでプログラミングしているのですが オブジェクトを配列でせんげんし、オブジェクトのメンバを使うとエラーが出てしまいます。ソースコードで説明すると using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace WindowsApplication1 {   public partial class Form1 : Form   {     public class car     {       int a;       public void set(int i)       {         a = i;       }     }     public Form1()     {       InitializeComponent();     }     private void label1_Click(object sender, EventArgs e)     {       car[] bike = new car[1];       bike[0].set(1);//ここでひっかかる     }   } } これをじっこうするとデバックは通るのですが、label1_Clickイベントが発生すると、「NULLの場所を参照しています」という意味のエラーが出てしまいます。 C#はほとんど初心者なので、初歩的なミスだとおもうんですが、 よろしければ御回答をお願いします。

共感・応援の気持ちを伝えよう!

  • 回答数1
  • 閲覧数235
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.1

こんにちわ。 確かにそのコードでは、エラーになります。 配列というのは、単にデータの集合を現しているに過ぎません。 つまり、 car[] bike = new car[1]; という記述は、carオブジェクトが1つ入る「箱(bike)」を用意しているに過ぎず、 上記の段階で、箱の中にcarオブジェクトが入るわけでありません。 箱の中にcarオブジェクトが入っていないにも関わらず、 以下のような記述をしてしまうと、 bike[0].set(1); 「bike[0]には何も入っていない=Null」と判定されエラーになってしまうのです。 質問者様がお望みの動きをさせたい場合、carオブジェクトをインスタンス化する必要があります。 つまり、 car[] bike = new car[1]; car myCar = new car(); myCar.set(1); bike[0] = myCar; または、 car[] bike = new car[1]; bike[0] = = new car(); bike[0].set(1); となります。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

なるほど・・・配列を宣言した時点では、オブジェクトがはいっていなかったのですね><。 わかりやすくて、親切なお返事ありがとうございます。たすかりました^^。

関連するQ&A

  • イベントパンドラで作成したインスタンスを、別のイベントパンドラで使う

    Visual studio 2005 のC#で勉強をしているのですが、インスタンスをグローバル変数のように宣言する仕方がわからなくてこまっています。 ソースコードで説明すると、 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace tesuto { public partial class Form1 : Form { public class car { public string a; } public Form1() { InitializeComponent(); car bike = new car();//このインスタンスをpicturebox //_Clickのイベントパンドラの中                 //で使いたい bike.a = "asd"; } private void pictureBox_Click(object sender, EventArgse) { string b; b = bike.a;//このようにしたいが、実際はエラーがでる } } } はじめての質問&クラスがなんたるかをしっかり理解していないので わかりにくい質問になったかもしれませんが、よければご回答ください。よろしくお願いします。

  • C#の配列の定数

    BCCを使用していたのですが、最近VS2013でC#を勉強し始めました フォームの指定した位置にいくつかのボタンを設置し、あらかじめ定義しておいた テーブルからボタンのtextを表示したいと思い、以下のようにコーディングしたのですが エラーが出てしまい思ったような結果に持って行くことができません C#ならこうした方がいいという指摘も含めて どうやるのがいいのか ご教授ください 足りない情報があれば追加します ちなみにまだテスト段階だから2列定義して1列しか表示するようにしかなってません ----------------------------------------------------------------------- using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace haneda { public partial class Form1 : Form { private Button[] buttons; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { int i; //ボタンコントロール配列の作成 this.buttons = new Button[table.MAX_R]; for (i = 0; i < buttons.Length; i++) { //ボタンコントロールのインスタンス作成 this.buttons[i] = new Button(); //プロパティ設定 this.buttons[i].Name = "btn" + i.ToString(); this.buttons[i].Text = table.roomNo[1, i]; <=ここがエラー this.buttons[i].Top = table.roomX01[i]; <=ここがエラー this.buttons[i].Left = table.roomY01[i]; <=ここがエラー this.buttons[i].Click += new System.EventHandler(button_Click); //コントロールをフォームに追加 this.Controls.Add(this.buttons[i]); } } private void button_Click(object sender, System.EventArgs e) { Button btn = (Button)sender; MessageBox.Show(btn.Name); } } public class define { public const bool IGNORE = false; //非表示 public const bool EFFECT = true; //表示 /* 最大値 */ public const int MAX_F = 2; //フロア数 public const int MAX_R = 3; //ルーム数 } public class table { /* ナンバー */ public readonly string[,] roomNo = new string[define.MAX_F, define.MAX_R] { { "101", "102", "103"}, { "201", "202", "203"} } /* 表示・非表示 */ public readonly bool[,] effectRoom = new bool[define.MAX_F, define.MAX_R] { {EFFECT, IGNORE, EFFECT}, {EFFECT, EFFECT, EFFECT} } public readonly int[] roomX01 = new int[define.MAX_R] { 5, 70, 135 } public readonly int[] roomY01 = new int[define.MAX_R] { 100, 100, 100 } } }

  • Form1で宣言したインスタンスをForm2で使う

    開発環境はMicrofoft visual stdio 2005 で開発言語はC#を使い、Windousアプリケーションでプログラミングしているのですが、あるフォームで宣言したインスタンスを別のフォームで使う方法がわかりません。具体的にソースコードで説明すると using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace tesuto {   public partial class Form1 : Form   {     class Car     {       public int a;     }     public void Form1_Load(object sender, EventArgs e)     {       Car bike = new Car();//ここで宣言したインスタンスを       bike.a = 10;       Form2 fm2 = new Form2(this);       fm2.Show();     }   }   public partial class Form2 : Form   {     public void Form2_Load(object sender, EventArgs e)     {       int b;       b = bike.a;//ここでこのように使いたい     }   } } ということです。 前も似たような質問をさせていただき、たくさんの回答をいただいたにも関わらず自分のプログラム能力が低く、理解できませんでした><。なのでよければ、回答は言葉だけではなくこの上のソースコードを基にして(コピペ貼り付けなどで)、すこしでいいですのでソースコードを書いていただけませんでしょうか。 また、プログラミングを初めてまだ間もないので、すこし初心者向けでお願いします。 質問する側なのに色々要求をして申し訳ないのですが、もし御面倒でなければ御回答をお待ちしております。 よろしくおねがいします。 

  • キー入力が反応しません。

    VisualStudio2005のC#になります。 ボタンを押す ラベルに文章 ボタン消える Enterキー押す ラベルの文章が変わる という処理を行いたいのですが、”Enterキー押す”以下が実行されません。なぜなのでしょうか?どうすれば実行されるのでしょう。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; namespace 消す { public partial class Form1 : Form { private bool EnterKeyDown; public Form1() { InitializeComponent(); } private void Form1_KeyDown(object sender, KeyEventArgs e) { if (EnterKeyDown == false) { EnterKeyDown = true; label1.Text = "押したよ"; } else { EnterKeyDown = false; label1.Text = "押したよ2"; } } private void button1_Click(object sender, EventArgs e) { button1.Visible = false; } } }

  • Visual Studio 2017C#

    下記のVisual Studio 2017 C# 19行目のXの定義がありません。 と出ました。 11行目で定義していると思うのですけど…。 どういうことなのか教えてください。 ご多忙のところ恐れ入りますが、ご回答のほどよろしくお願いします。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace jump25 { class Test { public int x = 10; } class Program { public static void Main(string[] args) { Test obj = new Test(); int y = object.x; Console.WriteLine(y); } } }

  • C#で構造体配列

    C#で構造体配列の操作練習?をしているのですが using System; using System.Collections.Generic; using System.Text; namespace test1 { public struct Data { public string name; // 名前 public uint value; // 値 } class read { Data[] human = new Data[300]; public static string idSearch() { for (int i = 0; i < 300; i++) { if (test1.read.human[i].value == 25) return test1.read.human[i].name; } } } } だと エラー CS0120: 静的でないフィールド、メソッド、またはプロパティ 'test1.read.human' で、オブジェクト参照が必要です。 と言うエラーが出るのですが、どうしてでしょうか?

  • C#で処理中の状況をStatusLabelに表示

    C#で処理中の状況をStatusLabelに表示させたいのですが、どうやらマルチスレッドを使えば良いらしい事は分かったのですが、説明しているページを参考にいろいろやってみたのですがどうもうまくいきません。 例えば次のような場合、10秒後に”9”と表示されて終わってしまうのですが、どの様に書き直せばよろしいでしょうか? すみません、どなたかご存じの方教えていただけないでしょうか。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Threading; namespace test_multithread3 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { for (int i = 0; i < 10; i++) { toolStripStatusLabel1.Text = i.ToString(); Thread.Sleep(1000); } } } }

  • C#のクラスで値渡しをする

    開発環境はMicrofoft visual stdio 2005 で開発言語はC#を使い、Windousアプリケーションでプログラミングしているのですが クラスのオブジェクトを代入すると、値渡しをしたいのに参照渡しになってしまい困っています。 ソースコードで説明すると class Car {   public int a; } Car bike = new Car(); Car bike_a = new Car(); Car bike_b = new Car(); bike_a = bike; bike_b = bike; bike_a.a = 10; bike_b.a = 20; この場合の出力結果(?)を bike_a.a = 10 にしたいのです。 構造体を使う方法もあるのですが、このクラスは拡張したいので、できればクラスで使いたいのです。 なにかこの問題を解決するような方法はないでしょうか? ちょと抽象的な質問で申し訳ないのですが、よければ御回答をお願いします。

  • C#

    form2で入力した文字を form1で表示させたいのですが、上手くいきません。プログラムの(文字制限の為)一部だけ のせます。アドバイス よろしくお願いします。 まず、form1 public class Form1 : System.Windows.Forms.Form { private System.Windows.Forms.MainMenu mainMenu1; private System.Windows.Forms.MenuItem menuItem1; private System.Windows.Forms.MenuItem menuItem2; private System.Windows.Forms.Label label1; private Form2 form2; /// <summary> /// 必要なデザイナ変数です。 /// </summary> private System.ComponentModel.Container components = null; public Form1() { // // Windows フォーム デザイナ サポートに必要です。 // InitializeComponent(); form2= new Form2(); label1.Text=string.Format("{0}",form2.s); // // TODO: InitializeComponent 呼び出しの後に、コンストラクタ コードを追加してください。 // } static void Main() { Application.Run(new Form1()); } private void menuItem2_Click(object sender, System.EventArgs e) { if (form2.ShowDialog(this) == DialogResult.OK) this.Refresh(); } } 次にform2です private void button1_Click(object sender, System.EventArgs e) { string s; s=(string)textBox1.Text; } public string s { get { return s; } }

  • C# フォームを閉じてもプログラムが終了しない

    前略 ・C#の初心者です。 ・下記のようなプログラムを作りたいと思っています。プログラムは<作りたいプログラム>の仕様どうりに動作していますが、Form1のFormClosingイベントに Application.Exit()を追加しないと フォーム1で "X"(閉じる)をクリックしても(フォームは非表示になりますが)プログラムが終了しません。プログラムでどこかおかしな部分があると思っています。Application.Exit()を追加しないでもプログラムを終了する方法を教えてください。 <作りたいプログラム> (1)Form1 のbutton1をクリックすると新しいForm2が作成され表示される。Form2が表示されるとForm1は非表示となる。 (2)Form2 のbutton1をクリックするとForm2が非表示となりForm1が表示される。 (3)Form1 の "X"(閉じる)をクリックしてプログラムを終了する。 //Form1.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace formClose { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Form2 form2 = new Form2(); form2.Show(); //フォーム2を表示 this.Hide(); //フォーム1を非表示 } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { Application.Exit(); //アプリケーション終了 } } } //Form2.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace formClose { public partial class Form2 : Form { Form1 form1 = new Form1(); public Form2() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { this.Close(); //フォーム2を閉じる } private void Form2_FormClosing(object sender, FormClosingEventArgs e) { form1.Show(); //フォーム1を表示する } } } 以上