powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Копирование коллекции
25 сообщений из 28, страница 1 из 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
25 сообщений из 28, страница 1 из 2
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Копирование коллекции
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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