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

时间:2009-03-27 01:25:34

标签: vb6

在我使用VB6的10多年里,我偶尔得到一个“ByRef参数类型不匹配”的错误,我根本找不到匹配。经过一段时间的挣扎之后,我总是以这种或那种方式强迫这种类型,但这次我想我会问。我包含了我认为可能与此有关的所有代码;但是你现在可以跳过它并在我证明问题后参考它:

Public Type PBufferType
  Location(9) As Integer ' code location
  ValueHi(9) As Integer  ' Vhi code
  ValueLo(9) As Integer  ' Vlo code
  Locked(9) As Integer   ' State of pair
  Gamma(9) As Single     ' Gamma between this segment and next
End Type

Public GammaBuffer(1) As PBufferType ' The main data type

Public SelectedBank as Integer

Function MeasureLuxAtCode(code As Integer) As Single
  Call TestPatternForm.DrawTestWindow(3, code) 
  MeasureLuxAtCode = MeasureLux(1)
End Function

问题发生在下面。 “LuxMinTarget = MeasureLuxAtCode(FirstLevel)”行生成“ByRef参数类型不匹配”错误,指示FirstLevel不是整数。

Sub DetermineIdealLuxCurve()
  Dim FirstLevel, FirstDACtoMeasure As Integer
  FirstDACtoMeasure = 0
  FirstLevel = GammaBuffer(SelectedBank).Location(FirstDACtoMeasure)
  LuxMinTarget = MeasureLuxAtCode(FirstLevel)
End Sub

但是它,FirstLevel 一个整数,不是吗?它是一个虚拟的int,它的值由一个返回int的UDT设置,那么我哪里出错?如果我强制它为这样的int:

  LuxMinTarget = MeasureLuxAtCode(Int(FirstLevel))

编译器/解释器很高兴。但我不是。

这是编译器中的错误还是只是我密集?

3 个答案:

答案 0 :(得分:40)

问题在于:

Dim FirstLevel, FirstDACtoMeasure As Integer

这实际上将FirstLevel声明为Variant,而不是您所期望的Integer

这是经典的VB6陷阱! (而且你不是第一个被它咬伤的人)。

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

Dim FirstLevel As Integer
Dim FirstDACtoMeasure As Integer

答案 1 :(得分:4)

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

Dim FirstLevel as Integer,FirstDACtoMeasure As Integer

答案 2 :(得分:1)

正如Mitch指出的那样,VB6只声明逗号分隔列表中的最后一个变量,并明确定义了该类型。声明了先前的条目,但作为变体。

要正确声明变量,您需要单独处理它们。

Dim FirstLevel As Integer
Dim FirstDACtoMeasure As Integer

在以前版本的VB,IIRC中也是这种情况,对VB6来说并不新鲜。