Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > И снова массивы


Автор: 4YBAK 1.3.2006, 20:38
Требуется нарисовать все точки из массива точек MyPoints.
Рисовать точку нужно только если она существует.
Почему-то нижеприведенный код отказывается работать:
Код

public class VvodUzlov : Form
{
n=1; // номер узла (точки)
Point[] MyPoints=new Point[100]; //массив в точками (узлами)
void DrawUzel(int x,int y) // метод для рисования узла на панел1
        {
            Graphics g=Graphics.FromHwnd(panel1.Handle);
            g.TranslateTransform(20,265);
            g.ScaleTransform(1,-1);
            g.FillEllipse(Brushes.Red,x*40-5,y*40-5,10,10);
        }


private void button1_Click(object sender, System.EventArgs e)
{
int X=int.Parse(textBox1.text);
int Y=int.Parse(textBox2.text);
MyPoints[n]=new Point(X,Y); // создаем узел (точку)
n++;
panel1.Invalidate(); // и вызываем событие Paint, которое обрабатывается ниже
}

private void panel1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
for(int i=1;i<=MyPoints.Length;i++)
{
if(MyPoints[i]!=null) // здесь выдает ошибку!
DrawUzel(MyPoints[i].X,MyPoints[i].Y);
}
}
}





Автор: Exception 1.3.2006, 20:46
Точка - это не ссылочный тип, а значит null'ем быть не может. Используй проверку на (myPoints[i].X != 0) && (myPoints[i].Y != 0).
Добавлено @ 20:50
А в блок else вставь конструкцию return: насколько я понял, если точка пустая, то и все последующие тоже пустые.

Автор: 4YBAK 1.3.2006, 21:41
Цитата(Exception @ 1.3.2006, 20:46 Найти цитируемый пост)
Точка - это не ссылочный тип, а значит null'ем быть не может. Используй проверку на (myPoints[i].X != 0) && (myPoints[i].Y != 0).

Эта идея меня посетила в первую очередь. Но кто мешает юзеру ввести точку с координатами (0,0) ?
Вот в этом и облом!
Хотя можно попробовать изначально забить в каждую точку координаты (-1,-1)
for(int i=1;i<=100;i++) MyPoints[i]=new Point(-1,-1);

А потом уже делать (myPoints[i].X >= 0) && (myPoints[i].Y >= 0)
Будем надеяться, сработает... Щас попробую.



Автор: 4YBAK 1.3.2006, 22:03
Получилось!!!

Ксати, можно поподробнее, что такое ссылочный тип? И какие еще типы бывают?
Ссылочный это всякие int, float, double?

Автор: Exception 1.3.2006, 22:42
Типы в .NET делятся на ссылочные и структурные. Структурными называются все примитивные типы (int, float), структуры и перечисления. Короче, все типы, производные от System.ValueType. Отличия структурных от ссылочных:
1. Память для них выделяется из стека
2. При копировании копируется не ссылка на объект, а его побитовая копия
3. Переменная "убивается" при выходе за область видимости, а не при сборке мусора
4. Структурные типы инициализируются значениями по умолчанию и не могут быть null.
Добавлено @ 22:43
Разумеется, это только основные отличия.

Автор: Artiom 2.3.2006, 15:09
http://www.rsdn.ru/article/dotnet/values.xml
Тут статья про типы. Довольно подробно

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)