Traté de conseguir un poco de ayuda anterior, y no creo que me proporcionó suficiente información, aunque agradezco todos los consejos.

El objetivo es simplemente para agregar una nueva instancia del Objeto de la Habitación a una matriz de impresión y a un cuadro de lista. Cuando un usuario intenta ingresar a una sala, nombre que ya está en existencia se debe mostrar simplemente en las especificaciones de la habitación en la que ya está en la matriz.

Sigo recibiendo una excepción de referencia nula.

Aquí está mi código:

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;
}
}
}
InformationsquelleAutor user2101459 | 2013-02-27

3 Comentarios

  1. 4

    El código debe ser

    if (roomArray[i] != null)

    Cada vez que se crea una matriz, usted tendrá que inicializar los elementos individuales antes de que usted pueda acceder a ellos.

    Room[] roomArray = new Room[20];
    roomArray[0] = new Room();
    • estaba a punto de dar la misma respuesta, pero luego descubrí que el OP se está inicializando roomArray en gustos de esta parte roomArray[count] = new Room(roomName); // a pesar de tener en otra parte es sospechoso
    • Sí vi que demasiado… yo sólo figura su mayor problema es, probablemente, la comprensión de cómo utilizar matrices en general, de ahí mi respuesta 🙂
  2. 3

    Debido a que los elementos de la Habitación dentro de la Habitación[] no estamos inicializado.

    Intentar

    public Form1()
    {
    InitializeComponent();
    for(int i = 0; i < roomyArray.Length; i++) roomArray[i] = new Room();
    }
  3. 1

    Como las otras respuestas han dicho, usted necesita inicializar la matriz antes de empezar a usarlo. Cuando usted escribe:

    Room[] roomArray = new Room[20];

    Lo que se le dicen a la computadora que hacer es reservar la suficiente memoria para las referencias a 20 objetos del tipo Room. Las otras soluciones propuestas están muy bien, pero si quieres rendimiento, intente lo siguiente:

    Según este MODO de respuesta, utilizando la siguiente función sería más eficiente que el resto de soluciones que hasta ahora han ofrecido. Esto también tiene el respaldo de evidencias de esta entrada del blog.

    Nota: me he convertido para el uso de los medicamentos genéricos

        ///<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;
    }
    }

    Uso

    Memset<Room>(roomArray, new Room());

Dejar respuesta

Please enter your comment!
Please enter your name here