Jack Famous написал: ты был там одним из зачинщиков
попрошу ВЫталия на ВЫ :-)
Парни, на самом деле даже диалог в теме сегодня может оказаться полезным для расширенной аудитории завтра. Юра, чем хорош форум, что никто не затавляет читать все, если не интересует тема.
Тему чистить, а то прочел, вроде и от 12 не флуд, а спор результат которого должна быть истина.
Алексей, про то, как в памяти хранятся массивы, и яи Виталий пытались разъяснить обычным языком. Напомню и дополню немного: Массив любых размерностей всегда состоит из одного непрерывного диапазона памяти. В каждом элементе массива хранится значение, а для типов String/Object– адрес значения/объекта вне массива: StrPtr/ObjPtr соответственно. У каждого массива есть своя отдельная структура вне массива (Type SAFEARRAY), описывающая количество элементов и LBound каждой размерности и т.п., в т.ч. и адрес начального элемента массива.
Так вот, весь трюк в быстром изменении размерностей и границ Lbound/Ubound заключается в том, чтобы не трогать сам массив, а поменять значения в структуре SAFEARRAY массива.
А то, чего хотите Вы – произвольно менять размерности, нашинковать, обрубая или наращивая массив, потребует медленно делать то, что делает Redim Preserve: - создать новый массив вместо существующего - скопировать элементы старого массива в новый - разрушить старый массив - освободив память, чтобы исключить утечки памяти,
Redim Preserve итак реализован на C/C+, быстрее него не получится, и я так понимаю Виталия, что ему поэтому и не интересно повторять то же самое. Просто сделайте в VBA обертку с Redim Preserve на подобные случаи, как и советует Виталий.
ZVI написал: 2. Юра (Юрий М) - Тема фактически становится "собственностью" форума, а не Вашей .
Все верно и очень жаль, что движок позволяет редактировать сообщения независимо от срока, что позволяет не только с пользой вернутся и дополнить, но и безвозвратно удалить содержание.
БМВ,БМВ, приветствую! Владимир, всё верно. Спасибо за подробный разбор. БМВ, Михаил, всегда был против изменений уже выложенных сообщений. Если бы отключить это свойство в движке, было бы намного понятнее что происходит в теме, кто что и когда ответил и т.д.
BedvitCOM.dll_v3.9 BedvitXLL.dll_v4.10 Добавил в библу новую универсальную функцию (по аналогии с выше обсуждаемыми): ArrayDtoD( arrayInOut - массив для преобразования lLboundRow - индекс начала измерения (строки) cElementsRow - количество элементов в измерении (строки) lLboundCol - индекс начала измерения (столбцы) cElementsCol - количество элементов в измерении (столбцы) lLbound3 - индекс начала измерения (3е измерение) cElements3 - количество элементов в измерении (3е измерение) ... всего 10 измерений ... ) Функционал: Изменить индекс начала измерения или количество элементов в любом из 10 измерений (или во всех сразу) или количество измерений. Данные не меняются, если где-то кол-во элементов уменьшается, то где-то должно увеличится. Так же реализовано автоматический расчет элементов первого незаполненного измерения (если указан 0), если есть строки, автоматом рассчитаются столбцы и наоборот. Общее количество элементов должно быть равно первоначальному. Если расчетное количество элементов нового измерения будет число не целое - выдаст ошибку. Пример из выше обсуждаемого кода: