4

我正在查看一些旧的 VB6 代码。我是 VB 新手,我来自 C/Java 背景,所以我不理解一些赋值语句。这是一个例子——

     Private Type UGH
       Rsp(3) As Byte
       ProgramId(7) As Byte
       RID(7) As Byte
       TID(3) As Byte
       FL(39) As Byte
    End Type
    Private UHeader As UGH

之后,分配如下:

    With UHeader
    StringToByteArray UHeader.ProgramId(), "ABCDPQRS"

我的问题是,为什么在上面的作业中 ProgramId 之后使用了括号?对我来说这似乎是一个函数调用,但它显然不是一个函数调用。那这是什么?

4

4 回答 4

5

好吧,实际上并不需要。在没有括号的情况下调用同一行将执行完全相同的操作。允许它的原因是因为它是一个字节数组。

也许像这样重写该行会使其更具可读性:

call StringToByteArray(UHeader.ProgramId(), "ABCDPQRS")

但这也是有效的:

call StringToByteArray(UHeader.ProgramId, "ABCDPQRS")

如果 StringToByteArray 方法是一个函数而不是子例程,它可能对您更有意义:

Private Function StringToByteArray(ByVal strValue As String) As Byte()
    'conversion code left out
End Function

然后你可以这样称呼它:

UHeader.ProgramId() = StringToByteArray("ABCDPQRS")

或这个:

UHeader.ProgramId = StringToByteArray("ABCDPQRS")
于 2012-05-01T13:30:31.583 回答
1

在这种情况下,括号用于指定一个数组。对于Rsp(3) as Byte,它表示从 0 到 2 索引的 3 个字节的数组。

对于 line:StringToByteArray UHeader.ProgramId(), "ABCDPQRS", StringToByteArray是一个采用字节数组的方法——将数组传递给方法时,将其作为array().

于 2012-05-01T13:29:27.933 回答
0

括号也用于数组语法。

所以说,StringToByteArray UHeader.ProgramId(), "ABCDPQRS"严格来说不是赋值,而是方法(子例程或函数)调用。 StringToByteArray将在您的程序中的某个地方定义,它可能会接受一个 ByRef 数组参数、一个字符串参数,并且它可能会将字符串参数复制到字节缓冲区中。

于 2012-05-01T13:31:09.447 回答
0

UHeader.ProgramId 实际上是一个指向数组的指针。你可以简单地这样做:StringToByteArray UHeader.ProgramID, "ABCDPQRS". VB6 中的规则是,函数需要对参数列表进行括号括起来,而 Subs 需要不使用括号,除非前面有 Call 语句,在这种情况下它们会这样做。

由于您通过引用传递数组(默认),因此在子例程中执行的操作是在数组本身上执行的。基本上,您传递一个指向数组的指针和一个文字字符串,子例程将使用字符串中的字符填充数组。有点像“非正式”函数调用,如果你愿意的话。

于 2012-05-08T21:49:06.627 回答