Страницы: 1
RSS
vba Можно ли Массив перевести в байты?, Массив() as Variant. Не про байтовый массив
 
Здравствуйте.
А можно ли как перевести массив (тип Variant) в набор байтов?
Без циклов с cstr и strconv к элементам
Изменено: vladjuha - 23.10.2021 11:26:25
 
Нет. Массив это и так набор байтов. Но в нём могут быть строки. Они располагаются в другом куске памяти. В массиве на них только указатели хранятся (в структуре Variant). Поэтому без цикла никак.
«Бритва Оккама» или «Принцип Калашникова»?
 
так чего там может только не быть  при желании  :D

Код
Dim a()
Dim b(1, 3)
Dim c As Range
Dim d As Object
Set d = CreateObject("scripting.dictionary")
d.Add 1, 1
d.Add 2, 2
Set c = Range("a1")
a = Array(b, c, d)
По вопросам из тем форума, личку не читаю.
 
Михаил, где набор байт? что это за код? точно к этой теме? :)
А если элементов 1000, 1000 строк с  d.Add ? (отморожу уши, бабушке назло?) :)
Изменено: bedvit - 25.10.2021 13:52:39
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit, плохо знаешь Мишу))
Он показал, что с помощью функции Array() можно создать массив из чего угодно и циклом это не считается (он есть, но мы его не видим)  :D
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Еще раз, данные в сообщении 2 - это как реализовано хранение в памяти. Циклы будут ВСЕГДА. Если вы их завернете, в какую либо функцию (к примеру Array()), и будите смело бегать с флагом - я сделал это без циклов - это тонкий (или толстый) троллинг :)
И где на выходе набор байтов, не вижу.
Изменено: bedvit - 25.10.2021 14:43:41
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit, Виталий , я к тому что в массиве может быть такая разно типовая чехарда, которая и циклом то вытаскивается не очень, а про записать разом и вовсе молчу.
По вопросам из тем форума, личку не читаю.
 
Цитата
bedvit: Если вы их завернёте и будете бегать с флагом "я сделал это без циклов" - это тонкий (или толстый) троллинг
я же потому и написал
Цитата
Jack Famous: циклом это не считается (он есть, но мы его не видим)
— подавляющее большинство пользователей Планеты (кроме местных), если не видят цикл в VBA, то считают, что его нет совсем ([1] и [2]) :D
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Чисто теоретически, если массив числовой (variant):
1.мы можем получить на него указатель, и сразу увидеть массив байтов. Задача выполнена.
Потом просто нужно вспомнить структуру варианта:
Первое поле – VARTYPE, которое на самом деле является typedef-ом для unsigned short. Следующие три поля – WORD, еще один typedef для unsigned short. Итак, VARIANT – это 8 байт плюс размер union. Union содержит достаточно места для своего самого большого члена, в данном случае это 8 байт (для double, currency или date). Итак, VARIANT – это 16 байт.
Т.е. для double каждые вторые 8 байт из 16 это нужно нам число.
2.Применяем эти знания
3.Профит...


Цитата
БМВ, написал:
в массиве может быть такая разно типовая чехарда, которая и циклом то вытаскивается не очень
Это да, но есть замечательная класс и метод, который пишет и читает вариант в поток/из потока (набор байт):
CComVariant::ReadFromStream
CComVariant::WriteToStream

К примеру, так я пишу все сохранения пользователей хранимые в массиве вариантов сразу в файл (причем это и строки и числа)

К сожалению это С/С++ (причем с циклами). Для VBA не взлетит, надо делать обертки.
Изменено: bedvit - 25.10.2021 19:29:00
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit, так а если там ссылка на объект?
По вопросам из тем форума, личку не читаю.
 
Ссылки на другие объекты и массивы не преобразуются в значения. Преобразуются только базовые, локализованные (в памяти) типы данных. Здесь или цикл по массиву (как же без него) или обход дерева по объекту.
Изменено: bedvit - 26.10.2021 08:27:50
«Бритва Оккама» или «Принцип Калашникова»?
Страницы: 1
Наверх