Передача массива экземпляров класса в качесве параметра

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
VB-constructor
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 160
Зарегистрирован: 24.07.2006 (Пн) 21:37
Откуда: Ростов-на-Дону

Передача массива экземпляров класса в качесве параметра

Сообщение VB-constructor » 29.06.2007 (Пт) 20:43

Передача массива экземпляров класса в качесве параметра в функцию

Есть класс RVL_TYPE, массив экземпляр этого класса передаю в функцию (точнее в свойство), но сразу же появляется ошибка компиляции, типа я неверно работаею с set

Код: Выделить всё
'определение давления под краями плиты фундамента
Public Property Get Sigma() As RVL_TYPE()
    Set Sigma = Sigma_
End Property

Public Property Set Sigma(vNewValue() As RVL_TYPE)
    Set Sigma_ = vNewValue
End Property

сли передавать не массив, а просто экз. класса - то все ок, если массив - простой, то тоже ок,
но массив класса - не выходит :(

вобщем подскажите, кто знает, как это обойти?

Заранее спасибо!
Человек рождён для того, чтобы достичь жизни...

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

Сообщение tyomitch » 29.06.2007 (Пт) 20:52

Убери Set :roll:
Изображение

VB-constructor
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 160
Зарегистрирован: 24.07.2006 (Пн) 21:37
Откуда: Ростов-на-Дону

Сообщение VB-constructor » 29.06.2007 (Пт) 21:12

:?
хорошо. появилась другая ошибка,
Can't assign to array

на строчке:
Код: Выделить всё
    Set Sigma_ = vNewValue

:?: :oops:

:( Может дело в том, что я все-таки передаю объекты, а не просто массив перемеынных?
Человек рождён для того, чтобы достичь жизни...

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

Сообщение tyomitch » 29.06.2007 (Пт) 21:20

Ну так убери ты Set, говорю же.
Изображение

VB-constructor
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 160
Зарегистрирован: 24.07.2006 (Пн) 21:37
Откуда: Ростов-на-Дону

Сообщение VB-constructor » 29.06.2007 (Пт) 21:26

Респект, tyomitch
я сперва не понял и убрал только там, где объявление свойства

Спасибо! :P

ЗЫ: только не понятно, почему при передачи просто объекта без set - никак нельзя, а передавать массив объектов - наоборот :?:
Человек рождён для того, чтобы достичь жизни...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 29.06.2007 (Пт) 21:26

VB-Constructor
У меня впечатление или ты действительно думаешь, что экземпляры классов хранятся в массиве Sigma_ ?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

VB-constructor
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 160
Зарегистрирован: 24.07.2006 (Пн) 21:37
Откуда: Ростов-на-Дону

Сообщение VB-constructor » 29.06.2007 (Пт) 21:50

моя картина такая. Если что не так, буду рад, если кто-то ее скорректирует:


что экземпляры классов хранятся в массиве Sigma_ ?

в нем хранятся ссылки, впрочем любая объектная переменная является ссылкой на объект. Но по правилам вб6 (их придусывал не я) объекной переменной можно птолько через set дать значение (ну то есть ссылку на значение), вот я и спрашиваю, почему же массив объектов тогда можно передавать без set, есть ли в этом какой-то скрытый смысл, которого я не понимаю?
Человек рождён для того, чтобы достичь жизни...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 29.06.2007 (Пт) 21:58

Хорошо, а то по твоим фразам "массив экземпляров", "массив объектов" я уже начал подозревать, что ты не понимаешь, что ты делаешь.

Set нужен потому есть такое понятие как "свойство по умолчанию"

Например класс CExample имеет свойство по умолчанию "Value".

Допустим есть переменная Test As CExample.

Если ты напишешь

Test = FooBar то свойству Test.Value присвоится некоторое значение.

Если ты напишешь Set Test = FooBar - То Test будет ссылаться на тот же объект, на котороый ссылается объектная переменная FooBar. При этом у объекта, на который до этого ссылался Test счётчик ссылок будет уменьшен (если объект вообще был).

Чтобы отличить установку ссылки и установку свойства по умолчанию и придумали Set.

Кстати, говорят в VB .NET убрали Set. Ума не приложу - как тамошний компилятор тогда отличает присвоение ссылки от присвоения значения свойства-по-умолчанию?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Сообщение tyomitch » 29.06.2007 (Пт) 21:59

Скрытого смысла нет.
Присваивание значения объекту неоднозначно: то ли мы сам объект заменяем, то ли его свойство по умолчанию.
Для этих двух значений присваивания сделаны два разных оператора.
При присваивании значения массиву такой неоднозначности нет, значит, нет и нужды в спецоператоре.
Изображение

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

Сообщение tyomitch » 29.06.2007 (Пт) 22:00

Хакер писал(а):Кстати, говорят в VB .NET убрали Set. Ума не приложу - как тамошний компилятор тогда отличает присвоение ссылки от присвоения значения свойства-по-умолчанию?

Там запретили непараметрические свойства по умолчанию.
Изображение

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 29.06.2007 (Пт) 22:01

Скрытый смысл в том, что массив это не объект. А вызовы AddRef(Set) VB сделает сам.
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 29.06.2007 (Пт) 22:06

tyomitch
Ах вот оно что...

Но свойства с параметрами всё таки могут быть дефолтными? Т.е. я по-прежнему смогу писать SomeCollection("asdasd") вместо SomeCollection.Item("aasdasd") ?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

VB-constructor
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 160
Зарегистрирован: 24.07.2006 (Пн) 21:37
Откуда: Ростов-на-Дону

Сообщение VB-constructor » 29.06.2007 (Пт) 22:30

Скрытый смысл в том, что массив это не объект. А вызовы AddRef(Set) VB сделает сам.

При присваивании значения массиву такой неоднозначности нет, значит, нет и нужды в спецоператоре.

Я полагал, что массив всегда передается по ссылке, потому что в параметрах кмпилятор не позволяет ему писать ByVal, но тем не менее он никогда не является объектом, верно?

Кстати, говорят в VB .NET убрали Set. Ума не приложу - как тамошний компилятор тогда отличает присвоение ссылки от присвоения значения свойства-по-умолчанию?
насколько я знаю, там все по умолчанию передается по ссылке, то есть наоборот... чем на вб6
Человек рождён для того, чтобы достичь жизни...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 29.06.2007 (Пт) 22:34

VB-constructor
Глупо было бы позволять передавать массив ByVal. Его что, надо было бы весь в стек пихать?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

VB-constructor
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 160
Зарегистрирован: 24.07.2006 (Пн) 21:37
Откуда: Ростов-на-Дону

Сообщение VB-constructor » 29.06.2007 (Пт) 22:48

Глупо было бы позволять передавать массив ByVal. Его что, надо было бы весь в стек пихать?
ну а почему и нет, если маленький массив, скажем 2х2 as single - почему б не запихать?

С другой стороны в Variant что угодня запихать можно, тормозит, его оправданное использование встречается довольно редко, но встречается и вариант можно передавать по значению, да, "пихают в стек"

с практической стороны - это все конечно некрасиво, но меня интересует структура вб
Человек рождён для того, чтобы достичь жизни...

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

Сообщение tyomitch » 30.06.2007 (Сб) 9:19

Хакер писал(а):Но свойства с параметрами всё таки могут быть дефолтными? Т.е. я по-прежнему смогу писать SomeCollection("asdasd") вместо SomeCollection.Item("aasdasd") ?

Могут.


VB-constructor писал(а):Я полагал, что массив всегда передается по ссылке, потому что в параметрах кмпилятор не позволяет ему писать ByVal, но тем не менее он никогда не является объектом, верно?

Массив не всегда передаётся по ссылке, потому что его можно положить в вариант и передать по значению.
Но даже когда он передаётся по ссылке, синтаксической неоднозначности присваивания не возникает.


Хакер писал(а):Глупо было бы позволять передавать массив ByVal. Его что, надо было бы весь в стек пихать?

А вот строку можно передавать ByVal. И в стек она при этом вся не пихается. Удивительно, да?
Во-вторых, VB6 позволяет передавать массивы по значению (см. выше).
В-третьих, другие языки (как минимум, Си и Паскаль со всеми их наследниками) позволяют передавать массивы по значению, складывая их в стек целиком.


VB-constructor писал(а):с практической стороны - это все конечно некрасиво, но меня интересует структура вб

http://bbs.vbstreets.ru/viewtopic.php?t=26906 подходит?
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 30.06.2007 (Сб) 10:03

А вот строку можно передавать ByVal. И в стек она при этом вся не пихается. Удивительно, да?

Нет.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Сообщение tyomitch » 30.06.2007 (Сб) 10:10

Тогда откуда возникает мысль, что массивы -- в отличие от строк -- надо целиком пихать в стек?
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 30.06.2007 (Сб) 11:16

А ты можешь предложить что-то ещё, кроме как пихание в стек или создание копии массива, и кидание в стек указателя на его SA-структуру?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Сообщение tyomitch » 30.06.2007 (Сб) 13:54

Ну вот видишь, ты сам знаешь альтернативный вариант.
Тогда как пять постов назад предлагал запихивание массива в стек как единственный.
А иначе почему "глупо было бы позволять передавать массив ByVal"?
Изображение

VB-constructor
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 160
Зарегистрирован: 24.07.2006 (Пн) 21:37
Откуда: Ростов-на-Дону

Сообщение VB-constructor » 30.06.2007 (Сб) 14:34

http://bbs.vbstreets.ru/viewtopic.php?t=26906 подходит?
еще бы!

Спасибо!
Человек рождён для того, чтобы достичь жизни...


Вернуться в Visual Basic 1–6

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

Сейчас этот форум просматривают: Google-бот и гости: 76

    TopList