2009-03-27 36 views
15

Trong hơn 10 năm tôi đã sử dụng VB6, mọi lúc và sau đó tôi nhận được lỗi "Loại đối số ByRef không khớp", nơi tôi không thể tìm thấy sự không phù hợp. Sau khi đấu tranh trong một thời gian tôi đã luôn luôn punted bằng cách buộc các loại một cách này hay cách khác, nhưng lần này tôi nghĩ rằng tôi muốn hỏi. Tôi bao gồm tất cả các mã tôi nghĩ rằng có thể có bất cứ điều gì để làm với điều này; nhưng bạn có thể bỏ qua nó ngay bây giờ và tham khảo nó sau khi tôi giải thích vấn đề:VB6 - Loại đối số ByRef lỗi không khớp - ở đâu?

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 

Sự cố xảy ra bên dưới. Dòng "LuxMinTarget = MeasureLuxAtCode (FirstLevel)" tạo ra lỗi "Loại đối số ByRef không khớp", chỉ ra rằng FirstLevel không phải là số nguyên.

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

Nhưng dang nó, FirstLevel một số nguyên, phải không? It's dim'ed một int, giá trị của nó được thiết lập bởi một UDT trả về một int, vì vậy mà tôi đã đi sai? Nếu tôi buộc nó vào phần int như sau:

 
    LuxMinTarget = MeasureLuxAtCode(Int(FirstLevel)) 

trình biên dịch/thông dịch viên hạnh phúc. Nhưng tôi thi không.

Vì vậy, đây có phải là lỗi trong trình biên dịch hay chỉ là tôi bị dày đặc?

+0

SelectBank và FirstDACtoMeasure được xác định ở đâu? –

+0

Tôi đã chỉnh sửa câu hỏi để thêm hai biến đó. SelectedBank = số nguyên toàn cục và FirstDACtoMeasure = số nguyên cục bộ. –

+0

Bạn chỉ có thể nhận được điều này khi gọi một phụ/chức năng có tham số được chuyển qua tham chiếu. Các định nghĩa của SelectedBank, FirstDACtoMeasure, DrawTestWindow() và MeasureLux() là gì? –

Trả lời

39

Vấn đề là ở đây:

Dim FirstLevel, FirstDACtoMeasure As Integer 

Điều này thực sự tuyên bố FirstLevel như một Variant và không phải là một Integer như bạn mong đợi.

Đây là một bản ghi VB6 cổ điển! (và bạn không phải là người đầu tiên bị cắn bởi nó).

Khai báo một biến trên mỗi dòng tránh vấn đề:

Dim FirstLevel As Integer 
Dim FirstDACtoMeasure As Integer 
+0

Bah. Tôi không nhận ra điều đó. Cuộc gọi tốt. –

+7

Chà, để tìm ra rằng sau một thập kỷ tôi không hiểu câu "Dim" ... Tôi cần uống! Cảm ơn! –

+0

VB6 là tất cả gotchas: - | – TheCrazyProgrammer

1

Như Mitch chỉ ra, VB6 chỉ tuyên bố biến cuối cùng trong danh sách dấu phẩy phân cách như một cách rõ ràng của các loại được xác định. Các mục trước được khai báo, nhưng dưới dạng biến thể.

Để các biến được khai báo chính xác, bạn cần xử lý riêng từng biến.

Dim FirstLevel As Integer 
Dim FirstDACtoMeasure As Integer 

Đây cũng là trường hợp trong các phiên bản trước của VB, IIRC, không mới đối với VB6.

4

John T, Bạn có thể khai báo rõ ràng các biến trong danh sách.

Dim FirstLevel dưới dạng số nguyên, FirstDACtoMeasure dưới dạng số nguyên

+0

Cảm ơn. Tôi đã nhận thức được điều đó, và có lẽ nên đã chỉ ra nó, mặc dù tôi thường đi với cách tiếp cận một dòng cho rõ ràng. –

+1

Bạn có thể, nhưng bạn không nên. Một khai báo biến trên mỗi dòng là thực hành phổ biến. –

Các vấn đề liên quan