Reputation: 697
For the 10+ years I've been using VB6, every now and then I get a "ByRef argument type mismatch" error where I simply can't find the mismatch. After struggling for a while I've always punted by forcing the type one way or another, but this time I thought I'd ask. I'm including all the code I think could have anything to do with this; but you can skip it now and refer to it after I demonstrate the problem:
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
The problem occurs below. The "LuxMinTarget = MeasureLuxAtCode(FirstLevel)" line generates a "ByRef argument type mismatch" error, indicating that FirstLevel is not an integer.
Sub DetermineIdealLuxCurve() Dim FirstLevel, FirstDACtoMeasure As Integer FirstDACtoMeasure = 0 FirstLevel = GammaBuffer(SelectedBank).Location(FirstDACtoMeasure) LuxMinTarget = MeasureLuxAtCode(FirstLevel) End Sub
But dang it, FirstLevel is an integer, isn't it? It's dim'ed an int, its value is set by a UDT that returns an int, so where did I go wrong? If I force it to an int like this:
LuxMinTarget = MeasureLuxAtCode(Int(FirstLevel))
the compiler/interpreter's happy. But I'm not.
So is this a bug in the compiler or just me being dense?
Upvotes: 15
Views: 33473
Reputation: 11
As already stated, the FirstLevel variable wasn't explicity given a type, so by default it gets the Variant type.
You can force inexplicit variables to a particular type with the DefXXX statement at the beginning of the form/module/class. This is a holdover from BASIC days. For example:
DefInt A-Z
This would make the default variable type Integer for all variables (beginning with A through Z). This default applies to the entire form/module/class, just as Option Explicit or Option Base does. You can mix and match any VB data type and assign them to letters as you see fit. The DefBool, DefByte, DefLng, DefCur, DefSng, DefDbl, DefDec, DefDate, DefStr, DefObj, and DefVar statements are available for other types. You cannot overlap or redefine letters already defined in subsequent statements in the same form/module/class.
Upvotes: 1
Reputation: 300539
The problem is here:
Dim FirstLevel, FirstDACtoMeasure As Integer
This actually declares FirstLevel
as a Variant
and not as an Integer
as you might expect.
This is a classic VB6 gotcha! (and you are not the first to be bitten by it).
Declaring a variable per line avoids the problem:
Dim FirstLevel As Integer
Dim FirstDACtoMeasure As Integer
Upvotes: 40
Reputation: 324
John T, You actualy can explicitly declare variables in a list.
Dim FirstLevel as Integer, FirstDACtoMeasure As Integer
Upvotes: 4
Reputation: 470
As Mitch pointed out, VB6 only declares the last variable in a comma delimited list as explicitly of the type defined. The previous entries are declared, but as variants.
To have the variables correctly declared, you need to handle them individually.
Dim FirstLevel As Integer
Dim FirstDACtoMeasure As Integer
This was also the case in previous versions of VB, IIRC, not new for for VB6.
Upvotes: 1