Как написать оператор или без дублирующего кода (VBA) - PullRequest
1 голос
/ 09 января 2020

Я знаю, что в большинстве других языков вы можете написать выражение if (ptr == NULL || ptr->foo()) {something bad happened}, чтобы проверить как действительность переменной, так и тест, который вы хотите выполнить. VBA не позволяет вам сделать это. Поэтому я ломаю голову над тем, чтобы найти способ написать следующий код без 1) использования перехвата ошибок в качестве средства условного ветвления и 2) не дублирования кода.

Type Vector
   vData() as Variant
   vSize as Long
End Type

Sub add(v as Vector, elem as Variant)
   Dim oldSize as Long
   if v.vSize = 0 Or UBound(v.vData) >= v.vSize then
      oldSize = v.vSize
      ReDim Preserve v.vData(0 to (oldSize * 2 + 1))
      v.vData(oldSize) = elem
      v.vSize = v.vSize + 1
   else
      v.vData(v.vSize) = elem
      v.vSize = v.vSize + 1
   end if
End Sub

Теперь этот код обработает sh на линии UBound независимо от того, равен ли vSize 0 или нет (если vData никогда не был Dim'd). Единственный другой способ, который я вижу, это сделать дополнительный оператор elseif для проверки UBound, но это дублирует код удваивания размера вектора.

В случае, если вы думаете, что это дубликат: VBA Short-Circuit `And` Альтернативы . Это говорит об альтернативах операторам AND (не или). Вложенные if (или операторы AND) не дублируют код, как OR.

Ответы [ 2 ]

2 голосов
/ 09 января 2020

Если я правильно понимаю, вам нужно проверить, был ли массив выделен или нет.

Один из таких вариантов - сделать это (как бы странно это не выглядело):

If (Not Not MyArray) <> 0 Then 'Means it is allocated

Ответ взят из этой темы - см. Больше идей.

0 голосов
/ 10 января 2020

Используя ответ SnowGroomer, я публикую полное решение:

Это класс с именем Vector

Private data() As Variant
Private size As Long

Property Get vSize() As Long
    vSize = size
End Property

Property Let vData(ByVal index As Long, elem As Variant)
    If index < 0 Then Exit Property
    If index < size Then
        data(index) = elem
    Else
        Me.add elem, index
    End If
End Property

Property Get vData(ByVal index As Long) As Variant
    If index < 0 Or (Not Not data) = 0 Then
        vData = Nothing
        Exit Property
    End If
    vData = data(index)
End Property

Public Sub add(elem As Variant, Optional index As Long = -1)
    If index > -2 Then
        If index = -1 Then
            If size = 0 Or (Not Not data) = 0 Then
                ReDim data(0)
                data(size) = elem
                size = size + 1
                Exit Sub
            Else 'size <> 0
                ReDim Preserve data(0 To size * 2 + 1)
                data(size) = elem
                size = size + 1
            End If
        Else 'index <> -1
            If index >= size Then
                ReDim Preserve data(0 To index)
                data(index) = elem
                size = index + 1
            Else 'index < vSize
                data(index) = elem
            End If 'index >= vSize
        End If 'index = -1
    End If 'index > -2
End Sub 'add
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...