powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Копирование коллекции
28 сообщений из 28, показаны все 2 страниц
Копирование коллекции
    #32411002
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток господа!
Задался вот я таким вопросом:
Как по-шустрому сделать копию коллекции? Без лупа. Что то вроде CopyMemory. Элементы колекции могут быть разные, в том числе, valid types(int, string...), UDT, другие коллекции. Естественно, что если элемент коллекции сам является обьектом то в коллекции будет хранится ничто иное как ссылка на него. В таком случае , даже получить размер обьекта для передачи его CopyMemory , не представляется возможным.
Тогда как же?
Сами форточки с этим как то справляются... Как?

Вопрос ведь даже не в типах, елси взять просто коллекцию, и скопировать по первому элементу(objptr), то имеем казус : созданы 2 коллекции, одна пустая (4 байта), другая с элементами(8 байт), копируем обьект... Под новую коллекцию память уже выделена, как в нее влезут лишние 4 байта? Corrupted memory? Да-с...

Вот такая вот дума ...

Буду признателен за идеи и высказывания.


Magnus
...
Рейтинг: 0 / 0
Копирование коллекции
    #32411067
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В пределах одного адресного пространства?
Что хочешь делать с массивами? Со строками? С объектами? (а со всем остальным проблем нет)
...
Рейтинг: 0 / 0
Копирование коллекции
    #32411071
Фотография hDrummer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на чём пишем, Магнус?
неужели на Басике??? ;))))
...
Рейтинг: 0 / 0
Копирование коллекции
    #32411083
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Лох Позорный
В смысле, адресного пространства одного приложения? Да.

Скопировать хочу. Просто сделать копию обьекта. Независимую, т.е не референс а именно самостоятельная копия.


на чём пишем, Магнус?
неужели на Басике??? ;))))


Жись такая :), Дрюм, и не говори...
Последние пол-года на всем пишу, вперемешку: и Басик, и С# и Басика.Нет
На данный момент, мелкая аппликуха. Я думал Васик больше не увижу, но эти клиенты блин... Чтоб у них Memory Corrupted >:)

Magnus
...
Рейтинг: 0 / 0
Копирование коллекции
    #32411084
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скопировать хочу.
Sel col1 = col2

Что есть (по твоему) копия массива? Строки (ну видимо то же, что и массива)? И, самое противное, что такое (по-твоему) копия COM-объекта?
...
Рейтинг: 0 / 0
Копирование коллекции
    #32411088
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sel col1 = col2
Не есть ли это копия ссылки на обьект? Как уже сказал, обьект комплексный, т.е. не просто массив, с ним то как раз все понятно.

ЯЭлементы колекции могут быть разные, в том числе, valid types(int, string...), UDT, другие коллекции. Естественно, что если элемент коллекции сам является обьектом то в коллекции будет хранится ничто иное как ссылка на него


Magnus
...
Рейтинг: 0 / 0
Копирование коллекции
    #32411163
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если элементами коллекции будут произвольные типы, то тут хоть на плюсах пиши, хоть на VB, скорость будет одинаковая +/- 1%, ибо основные потери будут на работу с VARIANT, а эта фишка по-любому API-шная (да и вряд ли VB на 3-х строках сгенерит код, худший чем сишный)

да и в чем проблема-то???
ради 3-х строк такое обсуждение

если бы надо было массивы копировать, то кинул бы код на сях для молниеносного создания копии, именно через memcpy.
...
Рейтинг: 0 / 0
Копирование коллекции
    #32412253
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 vdimas
Вы по моему сильно переоцениваете способности VB, доступ к элементам коллекции в нем сделан жутко медленно, вставка гораздо быстрее.

vdimas (да и вряд ли VB на 3-х строках сгенерит код, худший чем сишный) Не поверите, умудряется. К примеру простой цикл добавления елементов в listbox, если сделан средствами VB, т.е. Add... довольно медленный. Но если вместо этого добавлять элементы с помошью прямого сообщения контролу, то работает немного быстрее, особенно заметно на большом количестве элементов.


vdimas да и в чем проблема-то???
ради 3-х строк такое обсуждение

проблема: Цикл, по перебору элементов, три члена каждого элемента сами являются коллекциями в которых может быть от 10 до 20К элементов. В результате имеем вложенные циклы - не самая быстрая операция и без того медленного VB. В принципе я уже сделал, протестировал на средних значениях и результатом вообщем-то удовлетворен. Но все же на будущее хотелось бы знать варианты.


vdimas если бы надо было массивы копировать, то кинул бы код на сях для молниеносного создания копии, именно через memcpy.
С массивом понятно, CopyMemory отрабатывает без проблем, потому что размер массива может быть переопределен под новые данные перед копированием. Вопрос в другом: как быть в этом случае с коллекцией? Под нее память выделяется при создании, что случится при копировании в нее тем же способом коллекции с тысячами элементов? И как это вообще будет выглядеть, если коллекция содержит обычные типы вперемежку с указателями?
буду очень признателен за разьяснения.


Magnus
...
Рейтинг: 0 / 0
Копирование коллекции
    #32412300
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С массивом понятно
Интересно, что тебе с массивом понятно? Особенно, например, с массивом Variant'ов, где может быть все что угодно?
...
Рейтинг: 0 / 0
Копирование коллекции
    #32412355
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я имел ввиду массив стандартных типов, массив вариантов - не лучшее решение на VB.А с чего вдруг такая агрессия? Как уже говорил, COpymemory копирует массив стандартных типов без проблем.

Особенно, например, с массивом Variant'ов, где может быть все что угодно
Я кстати, об этом и спрашивал, если вы внимательно читали топик.

Magnus
...
Рейтинг: 0 / 0
Копирование коллекции
    #32412504
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А с чего вдруг такая агрессия?
Какая-такая агрессия? Просто пытаюсь понять о чем спич

авторЦикл, по перебору элементов, три члена каждого элемента сами являются коллекциями в которых может быть от 10 до 20К элементов
Что такое член элемента? Какой член? Какого элемента?
Эти три члена - в фиксированном месте родительской коллекции?
Вложенные коллекции (которые члены) только простые типы содержат?
Может тебе с помощью MemCpy скопировать родительскую коллекцию, потом вложенные (если они в фиксированных местах) еще раз скопировать?
...
Рейтинг: 0 / 0
Копирование коллекции
    #32412525
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И как это вообще будет выглядеть, если коллекция содержит обычные типы вперемежку с указателями?
А мне не изменяет память, что коллекция только Variant'ы и содержит? И простые типы все равно в Variant упаковываются?
...
Рейтинг: 0 / 0
Копирование коллекции
    #32412667
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какая-такая агрессия? Просто пытаюсь понять о чем спич

Интересно, что тебе с массивом понятно?
?? Да вот эта, вообщем то. Замнем для ясности. ОК?

Что такое член элемента? Какой член? Какого элемента?

Каждый элемент родительской коллекции - класс, классам свойственно иметь члены :) . В данном случае 3 из них также являются коллекциями, (элементы которых - UDT содержащие другие классы и простые типы), а остальные стандартные типы. Это если интересна полная иерарахия.

Может тебе с помощью MemCpy скопировать родительскую коллекцию, потом вложенные (если они в фиксированных местах) еще раз скопировать?

Так я об этом и спрашивал в начале! Как это реально будет выглядеть в памяти? Для MemCpy нужно указывать рамер исходной структуры. подсчитывать его через всю иерархию? Но ведь там же только пойнтеры. Или передавать только размер родительской коллекции(структуры)?
Пробовал с обычными коллекциями, при передаче размера структуры(коллекции), функция отрабатывает, но при завершении валится весь проэкт. Т.е. вероятно Corrupted memory. НЕт?

А мне не изменяет память, что коллекция только Variant'ы и содержит? И простые типы все равно в Variant упаковываются?
В Variant? Точно?


Magnus
...
Рейтинг: 0 / 0
Копирование коллекции
    #32412763
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Замнем для ясности. ОК?
Ну ок
И как всегда меня превратно поняли...

Каждый элемент родительской коллекции - класс
Объект?
У тебя каждый элемент колекции объект? И ты говоришь о MemCpy???
Пойду пить вотку... чего та я не панимаю в этой жизни ваапсче и в VB в частности...

Как это реально будет выглядеть в памяти?
Тебе нужно описание структуры Variant'а?

ПыСы
Имхо тебе нужно прочитать книжку по OLE Automation (а сначала по COM)
ПыПыСы
Ничего личного.


ПыПыПыПыСы
Алаверды
...
Рейтинг: 0 / 0
Копирование коллекции
    #32412764
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чтоб меня неправильно не поняли - я ни накого ни хател наехать
Так... окуел малость...
Сорь.
...
Рейтинг: 0 / 0
Копирование коллекции
    #32412765
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имхо тебе нужно прочитать книжку по OLE Automation (а сначала по COM)
Двумя руками за.
Спасибо.

ПСы: а если коротко?

Magnus
...
Рейтинг: 0 / 0
Копирование коллекции
    #32412888
Т
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Т
Гость
>А мне не изменяет память, что коллекция только Variant'ы и содержит? И простые типы все равно в Variant упаковываются?
>>В Variant? Точно?
Абсолютно.

Из ВБ можно сохранить данные в бинарный файл, при этом если сохраняется пользовательская структура, то автоматически сохраняются простые типы данных, вложенные структуры и строки, т.е. сохраняются указанные в "поинтерах" данные. Загрузить можно в такую же структуру. Доп.инфа в инете.
З.Ы. Не уверен, что данный фокус понимает коллекции.
З.Ы.2 ИМХО в данной задаче выбранная реализация через коллекции не верна.
...
Рейтинг: 0 / 0
Копирование коллекции
    #32413483
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Из ВБ можно сохранить данные в бинарный файл, при этом если сохраняется пользовательская структура, то автоматически сохраняются простые типы данных, вложенные структуры и строки, т.е. сохраняются указанные в "поинтерах" данные. Загрузить можно в такую же структуру. Доп.инфа в инете.

Спасибо за наводку, но увы инфу найти не смог. Был бы очень признателен за более точные кооердинаты или ссылку.

З.Ы.2 ИМХО в данной задаче выбранная реализация через коллекции не верна.
Можно услышать аргументы? Алтернативные варианты?

Спасибо.


Magnus
...
Рейтинг: 0 / 0
Копирование коллекции
    #32414434
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
все-таки не до конца понятно, что же нужно автору

Особенно совсем непонятен рассказ про 4 и 8 байт


Идет ли речь об объекте класса Collection ?

Если да, то выскажу пару соображений
1)
кусок кода
Dim p1 As Collection
Dim p2 as Collection

Set p1 = New Collection
Set p2 = p1
Создает НЕ копию коллекции, а ВТОРУЮ ССЫЛКУ на физически один объект

Копия, это когда измения, проделанные с копией не отражаются на первом экземпляре. В Вышеприведенном коде это не так.

2) Стуктура класса Collection не раскрывается MS, наружу он смотрит интерфейсами. В соответствии с рассыпанными по инету предположениями представляет собой двусвязный список. Это объясняет почему а) добавление быстрее индексированного доступа и б) безнадежно расчитывать на "копирование одной командой типа RtlMoveMemory".

3) быстрое копирование действительно на основе самописных коллекций построенных на основе массивов переменной длины. Примеров масса
поищи типа clsObjArray, clsObjColletion, clsIndexCollection и т.п.
Такой класс в две строки обучается копировать себя в другой экземпляр

Успехов.
...
Рейтинг: 0 / 0
Копирование коллекции
    #32414463
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Victosha
Я уже писал
Скопировать хочу. Просто сделать копию обьекта. Независимую, т.е не референс а именно самостоятельная копия.

Особенно совсем непонятен рассказ про 4 и 8 байт
Тут я немного в сторону зарулил, прошу прощвния.


Копия, это когда измения, проделанные с копией не отражаются на первом экземпляре
Это я прекрасно понимаю, устал повторять, что с этого разговор и начался.
И, это был не мой код а Лоха Позорного.(черт, ну и ник выбрал, неудобно даже к человеку так обращатся...)

Спасибо за хинт по структуре коллекции.


Далее, на самописные коллекции я уже поглядывал, с массивами организованными через MAlloc или IUnknown. Оба интерфейса, при реализации, практически эквивалентны в быстродействии, равно быстрее VB коллекции по все параметрам.
Если сделать полностью свою архитектуру, можно будет и копировать.

Что я искал, это более простой метод, не требующий переработки классов.


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


Magnus
...
Рейтинг: 0 / 0
Копирование коллекции
    #32414495
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IUnknown применительно к данной теме пользуют исключительно для управления счетчиком ссылок на объекты.
Про две строки - художественный оборот.
Но сильно упростит процедуру копирования Вашего класса, если Вы предположите, что все классы, описывающие экземпляры объектов, содержащихся в Вашей коллекции реалируют один и тот же интерфейс - типа IClone или ICopy.
...
Рейтинг: 0 / 0
Копирование коллекции
    #32414503
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IUnknown применительно к данной теме пользуют исключительно для управления счетчиком ссылок на объекты.
Имелось ввиду его использование как альтернатива MAlloc.

Но сильно упростит процедуру копирования Вашего класса, если Вы предположите, что все классы, описывающие экземпляры объектов, содержащихся в Вашей коллекции реалируют один и тот же интерфейс - типа IClone или ICopy.

Т.е. разработка собственных интерфейсов и внедрение их в классы.

Конечный результат смотрится довольно неплохо, но это все время, а его нет, как и бюджета.
Разве что дома, для себя.

Magnus
...
Рейтинг: 0 / 0
Копирование коллекции
    #32414523
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IUnknown использовать как альтернативу MAlloc нельзя - у них в принципе разные цели и задачи.
Malloc - это абстакция управления памятью, IUnknown - (придуманная почти исключительно специально для Васька) абстракция доступа к объявленным для внешнего доступа элементам класса. Его задача - имея ссылку на экземпляр объекта уметь спрашивать класс, какие он может применить к этому объекту методы. Между делом еще счетчиком ссылок управлять - типа мне больше этот объект не нужен - вычерни меня из списка. В общем - инструмент поддержки позднего связывания.

ЗЫ вот еще раз перечитал набор сообщений - есть подозрение, что КОПИРОВАНИЕ коллекций Вам в действительности не нужно.
...
Рейтинг: 0 / 0
Копирование коллекции
    #32414525
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IUnknown - (придуманная почти исключительно специально для Васька)
Кыш!
Если Васек - это Basic, то не IUnknown для него придуман, а IDispatch

В общем - инструмент поддержки позднего связывания.
Аналогично. Позднее связывание - IDispatch
...
Рейтинг: 0 / 0
Копирование коллекции
    #32414527
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
во как - шугают в ночи...
...
Рейтинг: 0 / 0
Копирование коллекции
    #32415342
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗЫ вот еще раз перечитал набор сообщений - есть подозрение, что КОПИРОВАНИЕ коллекций Вам в действительности не нужно.

Можно обойтись и без него, но нужно. Именно независимая копия.


Ok. Обсудим более конкретные примеры:
В данном случае используя библиотеку типов для доступа к IUnknown получим раннее связывание.
На основе этого кода, можно сделать свою коллекцию, сохраняя пойнтеры и контролируя их через IUnknown.

Public Sub Store(objThis As Object) As Long
Dim iU As IShellFolderEx_TLB.IUnknown

Set iU = objThis
iU.AddRef
Set iU = Nothing

Store = ObjPtr(objThis)
' objThis cannot terminate until we call iU.Release on it

End Sub


' To Retrieve the Object From the Long Value:
Private Property Get ObjectFromPtr(ByVal lPtr As Long) As Object
Dim objT As Object
' Bruce McKinney's code for getting an Object from the
' object pointer:
CopyMemory objT, lPtr, 4
Set ObjectFromPtr = objT
CopyMemory objT, 0&, 4
End Property


' To Delete The Object:
Public Sub Delete(ByVal lPtr As Long) As Long

Dim objThis As Object
Set objThis = ObjectFromPtr(lPtr)

Dim iU As IShellFolderEx_TLB.IUnknown
Set iU = objThis
iU.Release
Set iU = Nothing

Set objThis = Nothing
' objThis now terminates if there are no other external
' references to it.

End Sub


Точно так же, используя библиотеку типов , можно получить раннее связывание и для IMalloc.
С его помощью резервировать память под обьекты, ссылки на которые хранить в массиве.

Public Function SaveToMemory(ByRef b() as Byte) As Long
Dim lSize As Long
Dim lPtr As Long

On Error Resume Next ' Error checking: UBound/LBound can fail.
lSize = UBound(b) - LBound(b)
If Err.Number=0 Then
lSize = lSize + 1
Else
' No Data:
lSize = 0
End If

On Error Goto 0
lPtr = isMalloc.Alloc(lSize + 4)
If Not (lPtr=0) Then
' Store the size of the array:
CopyMemory ByVal lPtr, lSize, 4
If lSize > 0 Then
' Store the array:
CopyMemory ByVal lPtr + 4, b(0), lSize
End If
End If

' Return the Value of lPtr
SaveToMemory = lPtr
End Function

' To Restore the array from the Pointer lPtr:
Public Sub RestoreFromMemory(ByVal lPtr As Long, ByRef b() as Byte)
Dim lSize As Long

Erase b
If Not (lPtr = 0) Then
' Get the size of the array:
CopyMemory lSize, ByVal lPtr, 4
If lSize > 0 Then
ReDim b(0 To lSize-1) As Byte
CopyMemory b(0), ByVal lPtr, lSize
End If
End If

End Sub









Magnus
...
Рейтинг: 0 / 0
Копирование коллекции
    #32415695
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне трудно придумать ситуацию, когда использование IUnknown как инстумента упраления счетчиком ссылок приносит внятную пользу в программах, написанных на VB, для объектов порожденных в VB. И когда я говорил об этом, я имел ввиду сказать, что (как правило) в его использовании (почти) нет необходимости. Может быть найдется польза для управления Ком-объектами, порождаемыми внешними процессами.

Приведенный Вами код при следущем его использовании

Dim obj1 As MyClass
Dim obj2 As MyClass

Dim lngPtr as Long

set obj1 = New MyClass

lngPtr = Strore(obj1)

set obj2 = ObjectFromPtr(lngPtr)

НЕОТЛИЧИМ
от

Dim obj1 As MyClass
Dim obj2 As MyClass

Dim lngPtr as Long

Set obj1 = New MyClass
Set obj2 = obj1

И поэтому Store и ObjFromPtr для простых случаев - мусор.
Применительно к теме копирования - Вам решать...

По поводу IMalloc - удобно, если акуратно. Однако практика (моя) показывает, что в содержательных случаях не выигрывает перед Redim или String$, привнося потребность слежения за освобождением памяти.

Пользу от IMalloc можно попробовать получить при программировании IO через API (каналы, сокеты, почтовые слоты, файлы, ком порты). Мне почти всегда Redim хватало.

Правда есть еще одна специальная задачка, где полезно - преобразование указателя на строку к массиву заданного целочисленного типа (байт, целое, длинное целое) БЕЗ КОПИРОВАНИЯ байтов строки ( в задачах типа MIME кодирования)

В точки зрения оптимизации скорости при выполнении операции копирования массив представляется (мне) наиболее удобной конструкцией, какой бы смысл вы не вкладывали в термин "копирование"

PS все вышесказанное - всего лишь скромное мнение.
специально для волков - возможно ошибочное.
...
Рейтинг: 0 / 0
Копирование коллекции
    #32415719
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообщем то , мне хотелось получить простой ответ, можно или нет? Если да то как?
Резюмируя, можно сказать так: простого способа нет.
Применительно к копированию: более быстрый доступ к элементам коллекции.

Источник кода:
http://www.vbaccelerator.com/codelib/imalloc/objstore.htm


Magnus
...
Рейтинг: 0 / 0
28 сообщений из 28, показаны все 2 страниц
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Копирование коллекции
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]