2011-08-17 31 views
5

Một số chức năng như Split() sẽ trả về một mảng với -1 cho trên ràng buộc và không cho ràng buộc thấp hơn nếu mảng không có mặt hàng, ví dụ:vb6 mảng với -1 đối với giới hạn trên

Dim s() As String 
s = Split("", ",") 
Debug.Print UBound(s) 
Debug.Pring LBound(s) 

Trong trường hợp này UBound (s) sẽ bằng -1 và LBound (s) sẽ bằng 0. Tôi có một số tiền hợp lý của mã kiểm tra cho -1 trên giới hạn trên để xem nếu mảng có giá trị hay không. Điều này làm việc tuyệt vời.

Vấn đề là bây giờ tôi muốn thay đổi kiểu dữ liệu mảng từ chuỗi thành dài. Tôi dường như không thể tạo ra một dãy các giá trị dài với giới hạn trên của -1 và giới hạn dưới của 0 và các hàm Split()Join() chỉ hoạt động trên mảng chuỗi.

Tôi muốn có thể trả về một mảng dài với giới hạn trên là -1. Điều này có thể không?

+2

Tôi có thể đã bỏ lỡ điểm của bạn ở đây nhưng bạn có thể tạo một mảng Dài bằng 'upperbound' -1:' Dim lngArray (-1 To -1) Như Long' –

+0

@Matt @bugtussle Bugtussle, có lẽ bạn nên giải thích câu hỏi của bạn là bạn muốn có ** giới hạn dưới của số không ** cũng như giới hạn trên của -1! Nếu không, bạn phải biết hành vi của 'Split' thực sự tốt. Tôi sẽ chỉnh sửa câu hỏi của bạn cho phù hợp – MarkJ

Trả lời

4

Tôi không nghĩ rằng bạn có thể làm điều đó trong VB6 nó tự. Tuy nhiên, nếu bạn sẵn sàng để sử dụng chức năng Windows API SafeArrayCreateVector bạn có thể làm điều đó:

Private Declare Function LongSplitEmulator Lib "OLEAUT32.DLL" Alias "SafeArrayCreateVector" _ 
    (Optional ByVal vt As VbVarType = vbLong, _ 
    Optional ByVal low As Long = 0, _ 
    Optional ByVal count As Long = 0) As Long() 

Dim a() As Long 
a = LongSplitEmulator() 
MsgBox UBound(a) 

Nếu bạn cần phải làm điều đó cho kiểu dữ liệu khác mà bạn có thể thay đổi các tham số vt.

Xin lưu ý, tôi nghĩ rằng ban đầu tôi đã tìm hiểu về điều này từ câu trả lời của Vi2 cho số discussion này.

+0

hack rất đẹp! – wqw

+0

Điều này tạo ra một mảng với lbound 0 và ubound -1, hoạt động giống như hàm split khi 's = Split (" ",", ")'. Cảm ơn – bugtussle

0

Một vấn đề với VB6 là không có cách nào để tạo hoặc phát hiện một mảng trống (hoặc chưa được khởi tạo) một cách đáng tin cậy. Đôi khi, có thể phát hiện một mảng chưa được khởi tạo bằng cách kiểm tra xem giới hạn trên có lớn hơn giới hạn dưới hay không; Tuy nhiên, đây không phải là thanh lịch cũng không được ghi lại. Cách tốt nhất để thực hiện một điều đúng như vậy là để bao bọc mảng trong một Biến thể, và đặt Biến thể thành Rỗng để khởi tạo mảng. Sau đó bạn có thể sử dụng séc như Nếu VarType (v) = vbEmpty ...

+0

Tôi nghĩ nó thanh lịch. Bạn có thể xem xét nó như là mẫu đối tượng null – MarkJ

1

Bạn có thể viết chức năng phân chia của riêng bạn để làm điều này:

Private Sub SplitLongs(ByVal strData As String, ByRef lng() As Long) 
    Dim i As Integer 
    Dim s() As String 
    s = Split(strData, ",") 
    If UBound(s) = -1 Then 
     ReDim lng(-1 To -1) 
    Else 
     ReDim lng(LBound(s) To UBound(s)) 
     For i = LBound(s) To UBound(s) 
      If IsNumeric(s(i)) Then lng(i) = s(i) 
     Next 
    End If 
End Sub 
+1

Tôi đã tìm kiếm 'redim lng (-1 đến -1)'. Cảm ơn. Tôi nghĩ rằng tôi chỉ cố gắng 'ReDim (-1)' và 'ReDim (0 đến -1)' và nhận được một lỗi: P – bugtussle

0

Một cách khác là một mạnh mẽ gõ "nhà máy" chức năng:

Private Declare Function SafeArrayRedim Lib "oleaut32.dll" (ByVal ArrayPtr As Long, ByRef DataPtr As tagSAFEARRAYBOUND) As Long 

Private Type tagSAFEARRAYBOUND 
    cElements As Long 
    lLbound As Long 
End Type 

Public Type Feed 
    ID As String 
    Name As String 
    Active As Boolean 
    BasePath As String 
End Type 

Public Sub EmptyFeedArray(ByRef Arr() As Feed) 
Dim Data As tagSAFEARRAYBOUND 
Dim lngErr As Long 

    'Redim to one item 
    ReDim Arr(0 To 0) 
    'Reset the safe array to empty 
    lngErr = SafeArrayRedim(Not Not Arr, Data) 
    'Raise any errors 
    If lngErr <> 0 Then Err.Raise lngErr 
End Sub 

Tôi nghĩ rằng đây cũng làm việc với các loại không thể thiếu.

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