0

以前に助けを求めようとしましたが、すべてのアドバイスに感謝していますが、十分な情報を提供できなかったと思います。

目標は、オブジェクト ルームの新しいインスタンスを配列に追加し、リスト ボックスに出力することです。ユーザーが既に存在する部屋名を入力しようとすると、配列に既に存在する部屋の仕様に表示されるだけです。

null 参照例外が発生し続けます。

これが私のコードです:

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 Room_Class
{
    public partial class Form1 : Form
    {
        Room[] roomArray = new Room[20];
        int count = 0;

        public Form1()
        {
            InitializeComponent();
        }

        private void btnAddRm_Click(object sender, EventArgs e)
        {
            double length, width, height;
            if (VerifyRoomName() == true)
            {


                if (txtRmLen.Text == "" || txtRmWid.Text == "" || txtRmHt.Text == "")
                {
                    for (int i = 0; i < roomArray.Length; i++)
                    {
                        if (txtRmName.Text == roomArray[i].getRoomName())
                        {
                            txtRmName.Text = roomArray[i].getRoomName();
                            txtRmLen.Text = roomArray[i].getLength().ToString();
                            txtRmHt.Text = roomArray[i].getCeilingHeight().ToString();
                            txtRmWid.Text = roomArray[i].getWidth().ToString();
                        }
                        else
                        {
                            roomArray[count] = new Room(roomName);
                            count++;
                        }
                    }
                }
                else
                {
                    try
                    {
                        length = double.Parse(txtRmLen.Text);
                        width = double.Parse(txtRmWid.Text);
                        height = double.Parse(txtRmHt.Text);
                        for (int i = 0; i < roomArray.Length; i++)
                        {
                            if (txtRmName.Text == roomArray[i].getRoomName())
                            {
                                txtRmName.Text = roomArray[i].getRoomName();
                                txtRmLen.Text = roomArray[i].getLength().ToString();
                                txtRmHt.Text = roomArray[i].getCeilingHeight().ToString();
                                txtRmWid.Text = roomArray[i].getWidth().ToString();
                            }
                            else
                            {
                                roomArray[count] = new Room(roomName, length, width, height);
                                count++;
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message + "\n\nPlease Enter Valid Values", "Error!");
                    }
                }  
                PrintList();
            }

        }


        private void PrintList()
        {
            double paintTotal = 0, feetTotal = 0;
            string RoomName;
            lstRoomList.Items.Clear();
            for (int i = 0; i < count; i++)
            {
                RoomName = roomArray[i].getRoomName() + "\t" + roomArray[i].SquareFeet().ToString("n1") + "\t" + roomArray[i].GallonsPaint().ToString("n1");
                lstRoomList.Items.Add(RoomName);
                paintTotal += roomArray[i].GallonsPaint();
                feetTotal += roomArray[i].SquareFeet();
                lblTtlGallons.Text = paintTotal.ToString("n1");
                lblTtlSqFt.Text = feetTotal.ToString("n1");
            }
        }

        private bool VerifyRoomName()
        {
            if (roomName == "")
            {
                MessageBox.Show("Please Enter a Room Name", "Error!");
                return false;
            }
            else
                return true;
        }
    }
}
4

3 に答える 3

4

あなたのコードは

if (roomArray[i] != null)

配列を作成するときはいつでも、アクセスする前に個々の項目を初期化する必要があります。

Room[] roomArray = new Room[20];

roomArray[0] = new Room();
于 2013-02-27T02:08:32.667 に答える
3

Room[] 内の Room の要素は初期化されていないためです。

試す

public Form1()
{
    InitializeComponent();
    for(int i = 0; i < roomyArray.Length; i++) roomArray[i] = new Room();
}
于 2013-02-27T02:22:28.353 に答える
1

他の回答が言っているように、使用を開始する前に配列を初期化する必要があります。あなたが書くとき:

Room[] roomArray = new Room[20];

コンピューターに指示しているのは、タイプ の 20 個のオブジェクトへの参照に十分なメモリを確保することですRoom。提案された他の解決策は問題ありませんが、パフォーマンスが必要な場合は、次を試してください。

this SO answer によると、次の関数を使用すると、これまでに提供された他のソリューションよりもパフォーマンスが向上します。これには、このブログ投稿からの裏付けとなる証拠もあります。

注:ジェネリックを使用するように変換しました

    /// <summary>
    /// Fills an array with a default value
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="array">The array to fill with a default value</param>
    /// <param name="value">The default value</param>
    public static void MemSet<T>(T[] array, T value)
    {
        if (array == null)
        {
            throw new ArgumentNullException("array");
        }

        int block = 32, index = 0;
        int length = Math.Min(block, array.Length);

        //Fill the initial array
        while (index < length)
        {
            array[index++] = value;
        }

        length = array.Length;
        while (index < length)
        {
            Buffer.BlockCopy(array, 0, array, index, Math.Min(block, length - index));
            index += block;
            block *= 2;
        }
    }

使用法

Memset<Room>(roomArray, new Room());
于 2013-02-27T02:29:54.457 に答える