1

我有一个带有公共字节数组的类。让我们说它

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

还是我完全错过了重点?

4

5 回答 5

1

如果数组很小,并且很少添加新数据,那么一种简单的方法是:

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

如果 chunk 是一个字节数组,它看起来更像:

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 的内存加倍。这意味着更少的内存洗牌。

于 2008-09-16T22:42:18.827 回答
1

如果我没记错的话,在vb中你想用preserve来redim来增长一个数组。

于 2008-09-16T21:36:43.383 回答
0

您将不断使用 ReDim 关键字,这是非常低效的。

你在使用.Net吗?如果是这样,请考虑改用 System.Collections.Generic.List(Of Byte)。你可以使用它的 .AddRange() 方法来追加你的字节,如果你真的需要一个数组,它的 .ToArray() 方法可以取出一个数组。

于 2008-09-16T21:37:55.533 回答
0

你的问题似乎不是很清楚。您可能不应该公开字节数组。它可能应该是私有的,并且您应该提供一组公共函数,允许该类的用户对数组执行操作。

于 2008-09-16T21:38:06.577 回答
0

我认为您可能正在寻找除数组之外的其他东西。如果您试图频繁地逐步扩展数据量,则应使用动态数据结构,例如ArrayList. 这有一个Add方法可以将特定对象或值添加到数组中,而不用担心空间。它还有一个ToArray()你可以使用的漂亮方法。

如果您出于特定原因(我猜是性能)尝试使用数组,请使用ReDim Preserve array(newSize).

于 2008-09-16T21:41:37.817 回答