Расширение / Слияние массивов VB - PullRequest
1 голос
/ 17 сентября 2008

У меня есть класс с открытым массивом байтов. Допустим, его

Public myBuff as byte()

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

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

Или я полностью упускаю суть?

Ответы [ 5 ]

1 голос
/ 17 сентября 2008

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

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 каждый раз, когда указатель проходит конец буфера. это означает, что гораздо меньше таскается память.

1 голос
/ 17 сентября 2008

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

0 голосов
/ 17 сентября 2008

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

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

0 голосов
/ 17 сентября 2008

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

0 голосов
/ 17 сентября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...