63 Stimmen

Wie kann ich feststellen, ob ein Array in VB6 initialisiert ist?

Die Übergabe eines nicht dimensionierten Arrays an die Ubound-Funktion von VB6 führt zu einem Fehler. Ich möchte also überprüfen, ob das Array bereits dimensioniert wurde, bevor ich versuche, seine obere Grenze zu überprüfen. Wie kann ich dies tun?

5voto

iCodeInVB6 Punkte 51

In VB6 gibt es eine Funktion namens "IsArray", aber sie prüft nicht, ob das Array initialisiert wurde. Sie erhalten den Fehler 9 - Subscript out of range, wenn Sie versuchen, UBound auf ein nicht initialisiertes Array anzuwenden. Meine Methode ist der von S. J. sehr ähnlich, außer dass sie mit allen Variablentypen funktioniert und über eine Fehlerbehandlung verfügt. Wenn eine Nicht-Array-Variable geprüft wird, erhalten Sie den Fehler 13 - Type Mismatch.

Private Function IsArray(vTemp As Variant) As Boolean
    On Error GoTo ProcError
    Dim lTmp As Long

    lTmp = UBound(vTemp) ' Error would occur here

    IsArray = True: Exit Function
ProcError:
    'If error is something other than "Subscript
    'out of range", then display the error
    If Not Err.Number = 9 Then Err.Raise (Err.Number)
End Function

4voto

Francisco Costa Punkte 101

Da wollte Kommentar auf hier wird Post Antwort.

Die richtige Antwort scheint von @raven zu sein:

Dim someArray() As Integer

If ((Not someArray) = -1) Then
  Debug.Print "this array is NOT initialized"
End If

Wenn die Dokumentation oder Google nicht sofort eine Erklärung liefert, neigen die Leute dazu, es einen Hack zu nennen. Obwohl die Erklärung dafür zu sein scheint, dass Nicht ist nicht nur ein Logisch, es ist auch ein Bitwise-Operator, also behandelt er die Bit-Darstellung von Strukturen und nicht nur Boolesche Werte.

Ein Beispiel für eine andere bitweise Operation finden Sie hier:

Dim x As Integer
x = 3 And 5 'x=1

Das obige Und wird also auch als bitweiser Operator behandelt.

Darüber hinaus lohnt es sich zu prüfen, auch wenn dies nicht direkt mit dem Thema zusammenhängt,

Der Operator Not kann überladen werden, was bedeutet Struktur sein Verhalten umdefinieren kann, wenn sein Operand den Typ von t Überlastung

Dementsprechend interpretiert Not das Array als seine bitweise Darstellung und unterscheidet die Ausgabe, wenn das Array leer ist oder nicht, wie anders in Form einer vorzeichenbehafteten Zahl. Man kann also davon ausgehen, dass es sich nicht um einen Hack handelt, sondern nur um eine undokumentierte bitweise Darstellung des Arrays, die Not hier offenlegt und ausnutzt.

Not nimmt einen einzelnen Operanden und invertiert alle Vorzeichenbits, und weist diesen Wert dem Ergebnis zu. Das bedeutet, dass für vorzeichenbehaftete positive Zahlen, Not immer einen negativen Wert zurückgibt und für negative Zahlen, Not immer Logisch Bitweise

Ich habe mich entschlossen, diesen Beitrag zu schreiben, da er einen neuen Ansatz bietet, der von jedem, der Zugang dazu hat, wie Arrays in ihrer Struktur dargestellt werden, erweitert, ergänzt oder angepasst werden kann. Wenn also jemand einen Beweis dafür anbietet, dass es tatsächlich nicht beabsichtigt ist, dass Arrays nicht bitweise behandelt werden, sollten wir dies als keinen Hack und tatsächlich als die beste saubere Antwort akzeptieren, ob sie eine Unterstützung für diese Theorie anbieten oder nicht, wenn es ein konstruktiver Kommentar dazu ist, ist natürlich willkommen.

3voto

SJ00 Punkte 598

Dies ist eine Modifikation des Raben Antwort . Ohne Verwendung von APIs.

Public Function IsArrayInitalized(ByRef arr() As String) As Boolean
'Return True if array is initalized
On Error GoTo errHandler 'Raise error if directory doesnot exist

  Dim temp As Long
  temp = UBound(arr)

  'Reach this point only if arr is initalized i.e. no error occured
  If temp > -1 Then IsArrayInitalized = True 'UBound is greater then -1

Exit Function
errHandler:
  'if an error occurs, this function returns False. i.e. array not initialized
End Function

Diese sollte auch im Falle einer geteilten Funktion funktionieren. Die Einschränkung ist, dass Sie den Typ des Arrays (in diesem Beispiel String) definieren müssen.

2voto

jorge Punkte 19

Wenn Sie das Array initialisieren, setzen Sie eine ganze Zahl oder einen booleschen Wert mit einem Flag = 1 und fragen dieses Flag bei Bedarf ab.

2voto

Frodo Punkte 21
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function ArrPtr Lib "msvbvm60" Alias "VarPtr" (arr() As Any) As Long

Private Type SafeArray
    cDims As Integer
    fFeatures As Integer
    cbElements As Long
    cLocks As Long
    pvData As Long
End Type

Private Function ArrayInitialized(ByVal arrayPointer As Long) As Boolean
    Dim pSafeArray As Long

    CopyMemory pSafeArray, ByVal arrayPointer, 4

    Dim tArrayDescriptor As SafeArray

    If pSafeArray Then
        CopyMemory tArrayDescriptor, ByVal pSafeArray, LenB(tArrayDescriptor)

        If tArrayDescriptor.cDims > 0 Then ArrayInitialized = True
    End If

End Function

Verwendung:

Private Type tUDT
    t As Long
End Type

Private Sub Form_Load()
    Dim longArrayNotDimmed() As Long
    Dim longArrayDimmed(1) As Long

    Dim stringArrayNotDimmed() As String
    Dim stringArrayDimmed(1) As String

    Dim udtArrayNotDimmed() As tUDT
    Dim udtArrayDimmed(1) As tUDT

    Dim objArrayNotDimmed() As Collection
    Dim objArrayDimmed(1) As Collection

    Debug.Print "longArrayNotDimmed " & ArrayInitialized(ArrPtr(longArrayNotDimmed))
    Debug.Print "longArrayDimmed " & ArrayInitialized(ArrPtr(longArrayDimmed))

    Debug.Print "stringArrayNotDimmed " & ArrayInitialized(ArrPtr(stringArrayNotDimmed))
    Debug.Print "stringArrayDimmed " & ArrayInitialized(ArrPtr(stringArrayDimmed))

    Debug.Print "udtArrayNotDimmed " & ArrayInitialized(ArrPtr(udtArrayNotDimmed))
    Debug.Print "udtArrayDimmed " & ArrayInitialized(ArrPtr(udtArrayDimmed))

    Debug.Print "objArrayNotDimmed " & ArrayInitialized(ArrPtr(objArrayNotDimmed))
    Debug.Print "objArrayDimmed " & ArrayInitialized(ArrPtr(objArrayDimmed))

    Unload Me
End Sub

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X