VB6 - Ошибка несоответствия типа аргумента ByRef - где это?

В течение 10 лет, когда я использовал VB6, время от времени я получаю ошибку "несоответствие типа аргумента 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 является целым числом, не так ли? Он dim'ed int, его значение задается UDT, который возвращает int, поэтому, где я ошибся? Если я принужу его к int следующим образом:

  LuxMinTarget = MeasureLuxAtCode(Int(FirstLevel))

компилятор/интерпретатор счастлив. Но я не знаю.

Так это ошибка в компиляторе или просто я плотный?

Ответы

Ответ 1

Проблема здесь:

Dim FirstLevel, FirstDACtoMeasure As Integer

Это фактически объявляет FirstLevel как Variant, а не как Integer, как вы могли ожидать.

Это классическая версия VB6! (и вы не первый, кто его укусил).

Объявление переменной в строке устраняет проблему:

Dim FirstLevel As Integer
Dim FirstDACtoMeasure As Integer

Ответ 2

Джон Т, вы действительно можете явно объявлять переменные в списке.

Dim FirstLevel как целое, FirstDACtoMeasure As Integer

Ответ 3

Как указывал Митч, VB6 объявляет только последнюю переменную в списке с разделителями-запятыми, как указано явно определенного типа. Предыдущие записи объявлены, но как варианты.

Чтобы правильно объявить переменные, вам необходимо обрабатывать их по отдельности.

Dim FirstLevel As Integer
Dim FirstDACtoMeasure As Integer

Это было также в предыдущих версиях VB, IIRC, но не для VB6.