2013-03-31 4 views
1

Извините за новобранцем вопрос, но в настоящее время, если мне нужен мульти-массив (массив массивов), я объявляю его как Variant:Объявить мульти-массив

Dim ma() As Variant 
ReDim ma(1 To 3) 
ma(1) = Array(1, 2, 3) 

Кроме того, он работает, я хотел бы знать, есть альтернативная декларация. Например, следующий не работает:

Dim mm() As Integer() 
Dim mm()() As Integer 

P.S. Спасибо всем. Но у меня такое ощущение, что мой вопрос непонятен. Речь идет не о многомерных массивах, а о размерах массива. Речь идет о Тип. Да, есть много примеров для нескольких массивов (Array of Arrays), но все они используют Variant. Может быть (например, нет), это единственный способ создать мульти-массив? Это все, что мне нужно знать.

+0

http://www.vb-helper.com/howto_net_declare_arrays.html – Elior

+0

Да, вам нужно использовать варианты, по крайней мере, для «внешнего массива». Преимущество использования массивов массивов, конечно, состоит в том, что у вас могут быть оборванные массивы (подмассивы могут иметь разные значения LBound/UBound, а не одно и то же для всех). – Bob77

+1

Попробуйте массив UDT, если вам нужны конкретные типы для «столбцов». – wqw

ответ

1

Да, вы должны использовать варианты, по крайней мере, для «внешнего массива.» Преимущество использования массивов массивов, конечно, состоит в том, что у вас могут быть оборванные массивы (подмассивы могут иметь разные значения LBound/UBound, а не одно и то же для всех).

+0

вам не нужно использовать варианты.см. мой ответ ниже – Hrqls

+0

Почему это нисходящее?? ... –

0

Я думаю, что вы должны объявить о размере массива из-за выделения в памяти. , когда вы объявляете его как вариант, компилятор знает тип и размер во время выполнения, поэтому он не дает вам никаких ошибок. ., но когда вы объявляете его как некоторый тип .. вы должны объявить о размере .. смотрите на ссылке, которую я дал вам в первом комментарии

1

вы можете указать следующие за 3-D массивов:

Dim ma(1 To 3, 1 To 2, 0 To 5) as Integer 
Dim mb(0 To 2, 0 To 2, 0 To 2) as Integer 
0

при объявлении его с пустым(), то вы можете позже ReDim его с любыми размерами, которые вы хотите

создать следующий проект, запустите его, нажмите на кнопку 2 команды, и посмотреть на показанных данных

'1 form with 
' 2 command buttons : name=Command1, name=Command2 
' 1 label : name=Label1 
Option Explicit 

Private mintVal() As Integer 

Private Sub Command1_Click() 
    Dim intIndex1 As Integer, intIndex2 As Integer, intIndex3 As Integer 
    ReDim mintVal(5, 3, 4) As Integer 
    For intIndex1 = 0 To UBound(mintVal, 1) 
    For intIndex2 = 0 To UBound(mintVal, 2) 
     For intIndex3 = 0 To UBound(mintVal, 3) 
     mintVal(intIndex1, intIndex2, intIndex3) = intIndex1 + intIndex2 + intIndex3 
     Next intIndex3 
    Next intIndex2 
    Next intIndex1 
    ShowVals3 
End Sub 

Private Sub Command2_Click() 
    Dim intIndex1 As Integer, intIndex2 As Integer 
    ReDim mintVal(3, 7) As Integer 
    For intIndex1 = 0 To UBound(mintVal, 1) 
    For intIndex2 = 0 To UBound(mintVal, 2) 
     mintVal(intIndex1, intIndex2) = intIndex1 * intIndex2 
    Next intIndex2 
    Next intIndex1 
    ShowVals2 
End Sub 

Private Sub Form_Resize() 
    Dim sngWidth As Integer, sngHeight As Single 
    Dim sngCmdWidth As Single, sngCmdHeight As Single 
    sngWidth = ScaleWidth 
    sngCmdHeight = 495 
    sngCmdWidth = sngWidth/2 
    sngHeight = ScaleHeight - 495 
    Label1.Move 0, 0, sngWidth, sngHeight 
    Command1.Move 0, sngHeight, sngCmdWidth, sngCmdHeight 
    Command2.Move sngCmdWidth, sngHeight, sngCmdWidth, sngCmdHeight 
End Sub 

Private Sub ShowVals2() 
    Dim intIndex1 As Integer, intIndex2 As Integer 
    Dim strShow As String 
    strShow = "" 
    For intIndex1 = 0 To UBound(mintVal, 1) 
    strShow = strShow & CStr(mintVal(intIndex1, 0)) 
    For intIndex2 = 1 To UBound(mintVal, 2) 
     strShow = strShow & "," & CStr(mintVal(intIndex1, intIndex2)) 
    Next intIndex2 
    strShow = strShow & vbCrLf 
    Next intIndex1 
    Label1.Caption = strShow 
End Sub 

Private Sub ShowVals3() 
    Dim intIndex1 As Integer, intIndex2 As Integer, intIndex3 As Integer 
    Dim strShow As String 
    strShow = "" 
    For intIndex1 = 0 To UBound(mintVal, 1) 
    For intIndex2 = 0 To UBound(mintVal, 2) 
     strShow = strShow & CStr(mintVal(intIndex1, intIndex2, 0)) 
     For intIndex3 = 1 To UBound(mintVal, 3) 
     strShow = strShow & "," & CStr(mintVal(intIndex1, intIndex2, intIndex3)) 
     Next intIndex3 
     strShow = strShow & vbCrLf 
    Next intIndex2 
    strShow = strShow & vbCrLf 
    Next intIndex1 
    Label1.Caption = strShow 
End Sub 
+1

Это не делает ничего, чтобы помочь иметь «оборванные» массивы, хотя, вероятно, он и был в вопросе. Массивы массивов полностью отличны от многомерных массивов. – Bob77

+0

Это правда. В этом случае я бы создал пользовательский тип, содержащий внутренний массив (который можно переустановить для каждого элемента). – Hrqls

+0

Вы могли бы, но тогда у вас есть беспорядок, который нельзя передать как параметр, полученный как возвращаемое значение, хранящийся в коллекции и т. Д., Без создания отдельной DLL для его определения. – Bob77

0

другой ответ, используя UDT с массивами внутри него, которые могут быть redimmed

Option Explicit 

Private Type MyUdt 
    strOne() As String 
    strTwo() As String 
End Type 

Private mudtGlobal As MyUdt 

Private Sub Form_Click() 
    Dim intIndex1 As Integer 
    With mudtGlobal 
    For intIndex1 = 0 To UBound(.strOne) 
     .strOne(intIndex1) = CStr(intIndex1) 
    Next intIndex1 
    End With 'mudtGlobal 
    PrintVals mudtGlobal 
End Sub 

Private Sub Form_DblClick() 
    Dim udtLocal As MyUdt 
    'using local udt which is filled with the return value of the function 
    udtLocal = FacVals(udtLocal) 
    'passing the local udt as an argument 
    PrintVals udtLocal 
    'passing the global udt as an argument to show the different values 
    PrintVals mudtGlobal 
End Sub 

Private Sub Form_Load() 
    With mudtGlobal 
    ReDim .strOne(3) As String 
    ReDim .strTwo(2, 5) As String 
    End With 'mudtGlobal 
End Sub 

Private Sub PrintVals(udt2Print As MyUdt) 
    Dim intIndex1 As Integer, intIndex2 As Integer 
    Dim strPrint As String 
    strPrint = "" 
    With udt2Print 
    strPrint = .strOne(0) 
    For intIndex1 = 1 To UBound(.strOne) 
     strPrint = strPrint & "," & .strOne(intIndex1) 
    Next intIndex1 
    strPrint = strPrint & vbCrLf & vbCrLf 
    For intIndex1 = 0 To UBound(.strTwo, 1) 
     strPrint = strPrint & .strTwo(intIndex1, 0) 
     For intIndex2 = 1 To UBound(.strTwo, 2) 
     strPrint = strPrint & "," & .strTwo(intIndex1, intIndex2) 
     Next intIndex2 
     strPrint = strPrint & vbCrLf 
    Next intIndex1 
    End With 'udt2Print 
    Print strPrint 
End Sub 

Private Function FacVals(udtArg As MyUdt) As MyUdt 
    Dim intIndex1 As Integer, intIndex2 As Integer 
    'copying values 
    udtArg = mudtGlobal 
    'redimming the local udt 
    With udtArg 
    ReDim Preserve .strOne(7) 
    ReDim Preserve .strTwo(2, 9) 
    End With 'udtArg 
    With udtArg 
    For intIndex1 = 0 To UBound(.strTwo, 1) 
     For intIndex2 = 0 To UBound(.strTwo, 2) 
     .strTwo(intIndex1, intIndex2) = CStr(intIndex1 * intIndex2) 
     Next intIndex2 
    Next intIndex1 
    End With 'udtarg 
    FacVals = udtArg 
End Function 

дважды щелкните форму, чтобы увидеть результат значения

+0

Я забыл создать массив udt, чтобы сделать strOne и strTwo внутренние массивы, извините – Hrqls

+0

Очень полезно (+1), я буду играть с этим. –

Смежные вопросы