Расширение / слияние массивов VB

У меня есть класс с публичным массивом байтов. Скажем так

Public myBuff as byte()

События внутри класса получают фрагменты данных в байтовом массиве. Как сообщить коду события, чтобы он вставлял блок данных в конец? Скажем так

Private Sub GetChunk
  Dim chunk as byte
  '... get stuff in chunk
  Me.myBuff += chunk '(stick chunk on end of public array)
End sub

Или я совершенно упустил суть?

Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
1
0
2 123
5

Ответы 5

если я правильно помню, в vb вы хотите изменить с сохранением для роста массива.

но можете ли вы сделать это с массивом, определенным как общедоступный элемент в классе? то есть можете ли вы использовать зарезервированные слова piblic и redim вместе?

WaveyDavey 17.09.2008 01:37

ReDim Сохранить ваш массив (новый размер)

David J. Sokol 17.09.2008 01:38

Вы будете постоянно использовать ключевое слово ReDim, которое очень сильно неэффективно.

Вы используете .Net? В таком случае рассмотрите возможность использования вместо этого System.Collections.Generic.List (Of Byte). Вы можете использовать метод .AddRange () для добавления ваших байтов и метод .ToArray (), чтобы вернуть массив, если он вам действительно нужен.

List (Of Byte), похоже, имеет некоторые ограничения по размеру. Он не может превышать определенный порог, в отличие от ArrayList.

David J. Sokol 17.09.2008 01:42

Свойства Count и Capacity в List (Of Byte) являются Int32, как и ArrayList. ArrayList будет упаковывать каждый байт, который вы в него помещаете, добавляя массу сборщика мусора и накладных расходов на память. Возможно, вы столкнулись с проблемой фрагментации виртуальной памяти? Редко можно получить 2 ГБ бесплатного блока виртуальной машины.

Mike Dimmick 17.09.2008 04:30

Я так не верю. Я все это делал на коробке x64. Arraylist увеличил размер примерно до 3,5 ГБ, прежде чем я его убил, в то время как List умер примерно до 900 МБ.

David J. Sokol 17.09.2008 20:02

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

Я думаю, вы могли бы искать что-то другое, кроме массива. Если вы часто пытаетесь постепенно увеличивать объем данных, вам следует использовать динамическую структуру данных, такую ​​как ArrayList. У этого есть метод Add, который добавляет конкретный объект или значение в массив, не беспокоясь о пространстве. У него также есть изящный метод ToArray(), который вы можете использовать.

Если вы пытаетесь использовать массив по определенным причинам (я думаю, производительность), используйте ReDim Preserve array(newSize).

Если массив небольшой и новые данные добавляются нечасто, простой способ:

public BufferSize as long 'or you can just use Ubound(mybuff), I prefer a tracker var tho
public MyBuff

private sub GetChunk()
dim chunk as byte
'get stuff
BufferSize=BufferSize+1

redim preserve MyBuff(buffersize)
mybuff(buffersize) = chunk
end sub

если чанк представляет собой массив байтов, он будет выглядеть примерно так:

buffersize=buffersize+ubound(chunk) 'or if it's a fixed-size chunk, just use that number
redim preserve mybuff(buffersize)
for k%=0 to ubound(chunk) 'copy new information to buffersize
  mybuff(k%+buffersize-ubound(chunk))=chunk(k%)
next

если вы будете делать это часто (скажем, много раз в секунду), вы захотите сделать что-то вроде того, как работает класс StringBuilder:

public BufSize&,BufAlloc& 'initialize bufalloc to 1 or a number >= bufsize
public MyBuff() as byte

sub getdata()
bufsize=bufsize+ubound(chunk)
if bufsize>bufalloc then
  bufalloc=bufalloc*2
  redim preserve mybuff(bufalloc)
end if
for k%=0 to ubound(chunk) 'copy new information to buffersize
  mybuff(k%+bufsize-ubound(chunk))=chunk(k%)
next
end sub

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

Другие вопросы по теме