Создание вектора или матрицы из базового класса

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

ozyabkin
Новичок
Новичок
 
Сообщения: 42
Зарегистрирован: 16.11.2005 (Ср) 0:02

Создание вектора или матрицы из базового класса

Сообщение ozyabkin » 13.10.2006 (Пт) 0:12

Подскажите, пожалуйста, как заставить работать собственный класс с векторами и матрицами из элементов этого класса
Код: Выделить всё
Public Class Complex
    Public Sub New()
        MyBase.New()
    End Sub
    Public Sub New(ByVal Real As Double, ByVal Imag As Double)
        Re = Real
        Im = Imag
    End Sub
...
End Class


Ссылки на этот класс в виде
Код: Выделить всё
Dim A() As New Complex
...
ReDim A(N)

вызывают ошибку компилятора

Подскажите, пожалуйста, какую структуру команды New создать :?:

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 13.10.2006 (Пт) 7:21

Либо

Код: Выделить всё
Dim A() As Complex
ReDim A(N)
' а дальше инициализируешь каждый экземпляр

A(0) = New Complex


либо

Код: Выделить всё
Dim A() As Complex = {New Complex(), New Complex, New Complex()}
' и будет тебе массив из трех комплексных чисел
Весь мир матрица, а мы в нем потоки байтов!

ozyabkin
Новичок
Новичок
 
Сообщения: 42
Зарегистрирован: 16.11.2005 (Ср) 0:02

Сообщение ozyabkin » 13.10.2006 (Пт) 20:52

А как же быть с инициализацией переменных в команде ReDim Preserve A(N) - инициализировать каждый номер элемент вручную :?:

Если часто надо изменять массивы - на это уже уйдет много ресурсов.

Почему в C++, С# переменная сразу инициализируется в нулевое значение, а в VB NET 2005 переменная имеет значение Nothing :?:

Q2W
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 745
Зарегистрирован: 31.01.2004 (Сб) 20:46
Откуда: Питер

Сообщение Q2W » 13.10.2006 (Пт) 23:38

ozyabkin писал(а):Почему в C++, С# переменная сразу инициализируется в нулевое значение, а в VB NET 2005 переменная имеет значение Nothing :?:

Разве? По-моему объявив переменную в С получим в её значении содержимое памяти, которое было на месте этой переменной. Разве нет?
Я знаю верный путь

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 14.10.2006 (Сб) 6:23

ozyabkin писал(а):А как же быть с инициализацией переменных в команде ReDim Preserve A(N) - инициализировать каждый номер элемент вручную :?:



а это тебе чем не инициализация?

Код: Выделить всё
Dim A() As Complex = {New Complex(), New Complex, New Complex()}


можно даже значения задать

Код: Выделить всё
Dim A() As Complex = {New Complex(1.0, 1.0), New Complex(0.0, 1.0), New Complex(1.0, 0.0)}


ozyabkin писал(а):Почему в C++, С# переменная сразу инициализируется в нулевое значение, а в VB NET 2005 переменная имеет значение Nothing :?:


Это не есть правда. В сях переменная по умолчанию инициализируется мусором, находящимся в области памяти которая распределяется под переменную. В VB и в VB.NET в частности приинициализации по умолчанию для целых чисел получаем ноль, для булевых переменных False, для всего же остального (объектных переменных то бишь) получим Nothing. Для структур каждое поле будет инициализировано в соответствии со своим типом.
Весь мир матрица, а мы в нем потоки байтов!

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.10.2006 (Сб) 7:50

Q2W писал(а):
ozyabkin писал(а):Почему в C++, С# переменная сразу инициализируется в нулевое значение, а в VB NET 2005 переменная имеет значение Nothing :?:

Разве? По-моему объявив переменную в С получим в её значении содержимое памяти, которое было на месте этой переменной. Разве нет?

Локальную переменную в Сях -- да.
Поле объекта в C++/C# -- нет.
Изображение

ozyabkin
Новичок
Новичок
 
Сообщения: 42
Зарегистрирован: 16.11.2005 (Ср) 0:02

Сообщение ozyabkin » 14.10.2006 (Сб) 23:21

1. Согласно источнику MSDN http://msdn.microsoft.com/library/rus/default.asp?url=/library/rus/cpref/html/frlrfsystemarrayclasscreateinstancetopic.asp
в VB NET массив классов инициализируется следующим образом:
Код: Выделить всё
        Dim my3DArray As Array = Array.CreateInstance(GetType(Complex), 2, 3, 4)
        Dim i As Integer
        For i = my3DArray.GetLowerBound(0) To my3DArray.GetUpperBound(0)
            Dim j As Integer
            For j = my3DArray.GetLowerBound(1) To my3DArray.GetUpperBound(1)
                Dim k As Integer
                For k = my3DArray.GetLowerBound(2) To my3DArray.GetUpperBound(2)
                    my3DArray.SetValue(COMPLEXZERO, i, j, k)
                Next k
            Next j
        Next i


Этот код работает идеально, но не позволяет динамически изменять размерность массива командой ReDim

2. Следующее объявление также функционирует, но массив данных матрицы заполняется значением Nothing
Код: Выделить всё
        Dim X(,) As Complex
        Dim Y(,) As Complex = New Complex(2, 3) {}
        ReDim X(2, 10)
        X(0, 4) = Cmplx(3, 4)
        X(0, 6) = X(0, 0) + X(0, 4) ' вызывает ошибку транслятора, т.к. ячейка матрицы X(0, 0) имеет значение Nothing
        ReDim Preserve X(2, 5)


3. Возникает у меня следующий вопрос:
Как заставить собственный класс реагировать на изменение размерности массива вызовом соответствующей функции класса для его инициализации?
Код: Выделить всё
Dim X(,) As Complex ' Объявление не инициализированного класса
...
ReDim X(2,4) ' Необходимо инициализировать ячейки массива на значение 0+0i
X(1,4) = Cmplx(3,4) ' Значение ячейки равно 3+4i
...
ReDim Preserve X(2,10) ' Необходимо инициализировать дополнительные ячейки массива на значение 0+0i

2 вариант инициализации:
Код: Выделить всё
Dim X(2,4) as Complex = New Complex() {} ' Инициализация матрицы 2х4 на значение 0+0i

По умолчанию все приведенные команды инициализируют массив ячеек матрицы как Nothing.
Вложения
Complex2.Net.zip
Класс, реализующий вычисления над комплексными числами
(121.89 Кб) Скачиваний: 33

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 15.10.2006 (Вс) 7:55

1. У объекта типа Array есть возможность изменения размеров, не командой ReDim правда, но методом Resize (смотреть тут).
2. Разберемся с кодом номер 2.
Код: Выделить всё
Dim X(,) As Complex
Dim Y(,) As Complex = New Complex(2, 3) {}

это две строчки объявляют двумерный массив X и двумерный массив Y размером 3*4. Ни в одном из этих массивов члены не инициализируются.

Код: Выделить всё
ReDim X(2, 10)

здесь размер массива устанавливается в 3*11, инициализации элементов опять же нет.

Код: Выделить всё
X(0, 4) = Cmplx(3, 4)

сия строка мне вообще не понятна, либо должно быть New Complex(3, 4), или Cmplx некая функция возвращающая объект типа Complex?

Код: Выделить всё
X(0, 6) = X(0, 0) + X(0, 4) ' вызывает ошибку транслятора, т.к. ячейка матрицы X(0, 0) имеет значение Nothing

естественно вызывает.... эту ячейку никто не инициализипровал

Код: Выделить всё
ReDim Preserve X(2, 5)

Здесь размеры опять же меняются, но опять инициализации никакой

3. Собственно мало чем отличется от пункта 2. Инициализации здесь нет!

Инициализировать массивы при объявлении можно, смотри мой предыдущи пост в этой теме. После ReDim Preserve все дополнительные элементы нужно заново инициализировать через вызов конструктора.

К автору вопрос, чего он конкретно хочет? Ибо в общем случае, все равно придется проходить циклом по всем элементам массива с целью их инициализации.
Весь мир матрица, а мы в нем потоки байтов!


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 93

    TopList