VB6 - ByRef参数类型不匹配错误 - 它在哪里?

15
我使用VB6已有10年了,偶尔会遇到“ByRef argument type mismatch”错误,但是我找不到不匹配的地方。通常我都会强制转换数据类型来解决问题,但这一次我想问一下。下面的代码引发了错误:“LuxMinTarget = MeasureLuxAtCode(FirstLevel)”,其中显示“ByRef argument type mismatch”,表明FirstLevel不是一个整数。
FirstLevel被声明为整型,它的值由返回整数的用户定义类型(UDT)设置,那么我错在哪里呢?如果我像这样将其强制转换为整数:
" LuxMinTarget = MeasureLuxAtCode(Int(FirstLevel))"
则编译器/解释器会执行成功,但我并不满意。所以,这是编译器的错误还是我太愚蠢了?

SelectedBank和FirstDACtoMeasure在哪里定义的? - Joel Coehoorn
我编辑了问题,添加了这两个变量。SelectedBank是全局整数,而FirstDACtoMeasure是本地整数。 - Fred Hamilton
只有在调用参数通过引用传递的子函数时才能获得此内容。SelectedBank、FirstDACtoMeasure、DrawTestWindow() 和 MeasureLux() 的定义是什么? - Jim H.
4个回答

40

问题出在这里:

Dim FirstLevel, FirstDACtoMeasure As Integer

这实际上将FirstLevel声明为一个Variant,而不是您可能期望的Integer

这是一个经典的VB6陷阱!(您不是第一个被咬到的人)。

每行声明一个变量可避免此问题:

Dim FirstLevel As Integer
Dim FirstDACtoMeasure As Integer

啊,我没注意到。好的,谢谢提醒。 - Jim H.
7
哇,发现十年后我还是没有理解“Dim”语句......我需要喝一杯!谢谢! - Fred Hamilton
VB6全是坑爹的地方 :-| - TheCrazyProgrammer

4

John T,您实际上可以在列表中明确声明变量。

Dim FirstLevel as Integer, FirstDACtoMeasure As Integer

(注:该段文字为关于在IT技术中声明变量的内容)

谢谢。我知道这一点,也许应该指出来,尽管我通常采用每行一个的方法以增加清晰度。 - John T
1
你可以这样做,但不应该。每行只声明一个变量是一种常见的惯例。 - Mitch Wheat

1

如前所述,FirstLevel变量没有明确指定类型,因此默认为Variant类型。
您可以使用表单/模块/类开头的DefXXX语句将未明确指定类型的变量强制转换为特定类型。这是从BASIC时代遗留下来的。例如:

DefInt A-Z 

这将使所有以字母A到Z开头的变量默认为整数类型。此默认值适用于整个表单/模块/类,就像“Option Explicit”或“Option Base”一样。您可以混合和匹配任何VB数据类型,并根据需要分配它们给字母。其他类型的语句包括“DefBool”,“DefByte”,“DefLng”,“DefCur”,“DefSng”,“DefDbl”,“DefDec”,“DefDate”,“DefStr”,“DefObj”和“DefVar”。您不能重叠或重新定义在同一表单/模块/类中已定义的字母。

点赞因为我以前没听说过那些“DefXXX”语句。话虽如此,最后一句话似乎不准确。看起来我可以很好地定义一个_本地_变量。例如,如果我们有Sub Test():Dim a As Boolean:Debug.Print a:End Sub,那么调用Test会打印False,而直接调用Debug.Print a则会打印0。所以,也许应该说“在同一作用域”而不是“在同一表单/模块/类”? - 41686d6564 stands w. Palestine
DefXXX语句仅定义变量的默认类型,而不是Variant类型。这些语句不会影响任何显式变量类型声明。在DefXXX语句中,变量名字母不允许重叠。(例如:DefLng A-Q后面跟着DefInt P-Z是不合法的,因为P和Q被重复定义了。)为此给您带来的困扰,我们深感抱歉。 - Jovet

1
正如Mitch所指出的那样,VB6仅将逗号分隔列表中的最后一个变量明确声明为定义的类型。先前的条目被声明为变体。
要正确声明变量,您需要单独处理它们。
Dim FirstLevel As Integer
Dim FirstDACtoMeasure As Integer

我记得在之前的VB版本中也是这样,这不是VB6才有的新现象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接