PDA

View Full Version : سوال: ایجاد آرایه ای از اشیاء



jannatmakan
دوشنبه 26 فروردین 1392, 23:44 عصر
با عرض سلام؛
بنده می خواستم آرایه ای دو بعدی از node ها ایجاد کنم. پس طبیعتاً ابتدا کلاسی به نام bstnode.cs ایجاد کردم بدین صورت:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.ComponentModel;

namespace tree
{
class bstnode
{
public int[] gn=new int[8];
public int[] hn=new int[8];
public string name;
public bstnode[] child=new bstnode[8];

public bstnode()
{
int i;
for (i = 0; i < 8; i++)
{
gn[i] = 0;
hn[i] = 0;
}
}
}
}


و سپس یک کلاس bst.cs ایجاد کردم بدین صورت:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace tree
{
class bst
{

public void create(int h, int w)
{
int i, j;
Random r = new Random();
bstnode[,] map = new bstnode[h, w]; ///////My Problem
for (i = 0; i < h; i++)
{
for (j = 0; j < w; j++)
{
map[i, j].name = "City " + i.ToString() + " , " + j.ToString();

if (i - 1 >= 0)
{
map[i, j].gn[0] =r.Next(50, 300);
map[i, j].hn[0] =r.Next(map[i, j].gn[0] - 70, map[i, j].gn[0]);
}
if (i - 1 >= 0 && j + 1 < w)
{
map[i, j].gn[1] = r.Next(50, 300);
map[i, j].hn[1] = r.Next(map[i, j].gn[1] - 70, map[i, j].gn[1]);
}
if (j + 1 < w)
{
map[i, j].gn[2] = r.Next(50, 300);
map[i, j].hn[2] = r.Next(map[i, j].gn[2] - 70, map[i, j].gn[2]);
}
if (i + 1 < h && j + 1 < w)
{
map[i, j].gn[3] = r.Next(50, 300);
map[i, j].hn[3] = r.Next(map[i, j].gn[3] - 70, map[i, j].gn[3]);
}
if (i + 1 < h)
{
map[i, j].gn[4] = r.Next(50, 300);
map[i, j].hn[4] = r.Next(map[i, j].gn[4] - 70, map[i, j].gn[4]);
}
if (i + 1 < h && j - 1 >= 0)
{
map[i, j].gn[5] = r.Next(50, 300);
map[i, j].hn[5] = r.Next(map[i, j].gn[5] - 70, map[i, j].gn[5]);
}
if (j - 1 >= 0)
{
map[i, j].gn[6] = r.Next(50, 300);
map[i, j].hn[6] = r.Next(map[i, j].gn[6] - 70, map[i, j].gn[6]);
}
if (i - 1 >= 0 && j - 1 >= 0)
{
map[i, j].gn[7] = r.Next(50, 300);
map[i, j].hn[7] = r.Next(map[i, j].gn[7] - 70, map[i, j].gn[7]);
}

}
}
}//End create

/*public void preorder(bstnode t, ListBox id, ListBox name)
{
if (t != null)
{
id.Items.Add(t.gn);
name.Items.Add(t.name);
preorder(t.left, id, name);
preorder(t.right, id, name);
}
}

public void inorder(bstnode t, ListBox id, ListBox name)
{
if (t != null)
{
inorder(t.left, id, name);
id.Items.Add(t.gn);
name.Items.Add(t.name);
inorder(t.right, id, name);
}
}

public void postorder(bstnode t, ListBox id, ListBox name)
{
if (t != null)
{
postorder(t.left, id, name);
postorder(t.right, id, name);
id.Items.Add(t.gn);
name.Items.Add(t.name);
}
}

public Boolean insert(int x, string n)
{
bstnode cur = root;

if (root == null)
{
root = new bstnode(x, n);
return root != null;
}

for (; ; )
{
if (x <= cur.gn)
{
if (cur.left != null)
{
cur = cur.left;
}
else
{
cur.left = new bstnode(x, n);
return cur.left != null;
}
}
else
{
if (cur.right != null)
{
cur = cur.right;
}
else
{
cur.right = new bstnode(x, n);
return cur.right != null;
}

}
}
}//end insert*/
}
}


و سپس به وسیله ی دو تکست باکس طول و عرض آرایه رو گرفتم و در رویداد کلیک btncreate این کد رو نوشتم:


private void btncreate_Click(object sender, EventArgs e)
{
int row, col;
row=Convert.ToInt32(txtheight.Text);
col=Convert.ToInt32(txtwidth.Text);
bs.create(row, col);

}//End btncreate


برنامه اجرا می شه، امّا هنگامی که می خوام از اشیاء آرایه استفاده کنم، خطا می ده و به عبارتی دیگر کاملاً واضحه که اون قسمت از کدی که با کلمه ی My Problem مشخص کردم، آرایه ای دو بعدی از اشیاء رو به درستی Create نمی کنه!

jannatmakan
دوشنبه 26 فروردین 1392, 23:45 عصر
در ضمن اون سبز ها رو اصلاً کار نداشته باشید :لبخند:

plus
سه شنبه 27 فروردین 1392, 00:03 صبح
ببینید، وقتی شما یک آرایه از اشیا با new درست میکند، فقط یک شی "آرایه" درست کردین که جای مثلا n x m شی از نوع مورد نظر رو داره. یعنی شما n x m شی درست نکردین، بنابراین

map[i, j].name = "City " + i.ToString() + " , " + j.ToString();

مشکل داره چون، شی j , i ام هنوز ساخته نشده. قبلش، شما باید به ازای هر خانه، یک شی درست کنید و در آرایه قرار بدین:

//....
for (i = 0; i < h; i++)
{
for (j = 0; j < w; j++)
{
map.SetValue(new bstnode(), i, j);
map[i, j].name = "City " + i.ToString() + " , " + j.ToString();
// ....

jannatmakan
سه شنبه 27 فروردین 1392, 00:13 صبح
خیلی ممنون واقعاً لطف کردین. از سایر دوستانی که به سوال بنده نگاه کردن تشکّر می کنم.