2009-03-27 9 views
15

Od ponad 10 lat używam VB6, od czasu do czasu pojawia się błąd "Niedopasowanie typu argumentu ByRef", w którym po prostu nie mogę znaleźć niezgodności. Po chwili zmagań zawsze punted przez zmuszanie typu w ten czy inny sposób, ale tym razem myślałem, że zapytam. Załączam cały kod, który moim zdaniem może mieć coś z tym wspólnego; ale można pominąć go teraz i odnoszą się do niego po tym, jak wykazać problem:VB6 - Błąd typu niedopasowania argumentu ByRef - gdzie on jest?

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 

Problem pojawia się poniżej. Linia "LuxMinTarget = MeasureLuxAtCode (FirstLevel)" generuje błąd "Brak zgodności typu argumentu ByRef", wskazując, że FirstLevel nie jest liczbą całkowitą.

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

Ale Dang nim Firstlevel jest liczbą całkowitą, prawda? Zmieniono int, jego wartość jest ustalana przez UDT, który zwraca int, więc dokąd się pomyliłem? Jeśli zmusić go do int takich jak to:

 
    LuxMinTarget = MeasureLuxAtCode(Int(FirstLevel)) 

kompilator/tłumacz jest szczęśliwy. Ale ja nie jestem.

Czy jest to błąd w kompilatorze, czy tylko gęsty?

+0

Gdzie SelectedBank i FirstDACtoMeasure zdefiniowane? –

+0

Edytowałem pytanie, aby dodać te dwie zmienne. SelectedBank = globalna liczba całkowita i FirstDACtoMeasure = lokalna liczba całkowita. –

+0

Można uzyskać to tylko podczas wywoływania sub/funkcji, której parametr (y) są przekazywane przez odniesienie. Jakie są definicje SelectedBank, FirstDACtoMeasure, DrawTestWindow() i MeasureLux()? –

Odpowiedz

39

Problemem jest tutaj:

Dim FirstLevel, FirstDACtoMeasure As Integer 

To rzeczywiście deklaruje FirstLevel jako Variant a nie jako Integer jak można się było spodziewać.

To klasyczna kostka VB6! (i nie jesteś pierwszym, który go ugryzł).

Deklarowanie zmiennej na linię unika problemu:

Dim FirstLevel As Integer 
Dim FirstDACtoMeasure As Integer 
+0

Bah. Nie zauważyłem tego. Dobra decyzja. –

+7

Wow, aby się przekonać, że po dziesięciu latach nie zrozumiałem słowa "Dim" ... Potrzebuję drinka! Dzięki! –

+0

VB6 to wszystko getchas: - | – TheCrazyProgrammer

1

Jako Mitch wskazał, VB6 deklaruje tylko ostatniej zmiennej na liście rozdzielany przecinkami jako jawnie typu zdefiniowane. Poprzednie wpisy są zadeklarowane, ale jako warianty.

Aby poprawnie zdefiniować zmienne, należy postępować z nimi indywidualnie.

Dim FirstLevel As Integer 
Dim FirstDACtoMeasure As Integer 

Tak było również w poprzednich wersjach VB, IIRC, a nie nowych dla VB6.

4

John T, Faktycznie można jawnie zadeklarować zmienne na liście.

Dim Firstlevel jak Integer, FirstDACtoMeasure As Integer

+0

Dzięki. Byłem tego świadomy i prawdopodobnie powinienem był to wskazać, chociaż zwykle stosuję podejście "jeden za linię" dla jasności. –

+1

Możesz, ale nie powinieneś. Jedna deklaracja zmiennych w wierszu jest powszechną praktyką. –