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.