2012-11-20 151 views
0

我有一個數組路徑...此數組包含嵌套數組路徑的列表。它可能看起來像這樣:redim嵌套數組

path(0 1 2 3 4 5 6 7 8) 
"1" | 1, 1, 1, 1, 1, 1, 1, 1, 1 | 
"2" | 4, 3, 1, 4, 2, 3, 4, 3, 2 | 
"3" | 1, 1, , 2, 1, 2, 3, 3, 2 | 
"Val" A, B, C, D, E, F, G, H, I 

現在我有一個小循環來獲取第二行的最大值。

x = 1 
For c = 0 To UBound(path) 
    If IsArray(path(c)) Then 
     If CInt(path(c)(x)) <= maxDimension1 Then 
     maxDimension1 = CInt(path(c)(x)) 
     End If 
    End If 
Next 
redim preserve pathValues(maxDimension1 - 1) 

我現在必須找到行「2」中的元素的最大數量的元素,並將pathValues中的數組元素redim到此。 我想:

For Dimension2 = 1 To maxDimension1 
    For c = 0 To UBound(Path) 
     If IsArray(Path(c)) Then 
      If CInt(Path(c)(x)) = Dimension2 Then 
       If CInt(Path(c)(2)) >= maxDimension2 Then 
       maxDimension2 = CInt(Path(c)(2)) 
       End If 
      End If 
     End If 
    redim PathValues(c)(maxDimension2) //Syntax Error 
    next 
next 

是有辦法避免與多維數組一個解決方法嗎? 用於解釋:pathValues看起來像這樣到底:

PathValues() = (C,(E, I),(B, F, H),(A, D, G)) 
+0

是否有必要這麼複雜,你想要解決什麼問題?此外,您無法重新設定數組的最後一個維度。 – InContext

+0

@Philip A Barnes:是的,不幸的是它有必要變得如此複雜,但對我來說,我無法重新創建數組對於我來說是新事物 這是從數據庫中的數據創建SNMP仿真的測試數據的解決方案檢查錯誤處理 – Vogel612

+1

實際上,如果不使用「保留」,您可以'Redim'數組的最後一個維度或任何維度。如果使用'Preserve'關鍵字,就像'Redim Preserve'一樣,您只能重新定義最後一個尺寸。 –

回答

0

我通過遞歸調用使用x作爲「深度」和完整路徑的函數可以創建包含空元件的一個單個陣列固定它稍後寫入的值。 你只需要添加一個語句來整理你不想要的上限,因爲它們屬於其他數組。對於其他所有工作都很好

Function iterate_Path(path As Variant, x As Integer, value_x As Variant) As Variant 
Dim insideArray, returnPath 
returnPath = Array() 

For c = 0 To UBound(path) 
    If IsArray(path(c)) Then 
     If CInt(path(c)(x)) = value_x Then 
      If x <> UBound(path(c)) Then 
       If CInt(path(c)(x)) > UBound(returnPath) + 1 Then 
        ReDim Preserve returnPath(CInt(path(c)(x)) - 1) 
       End If 
       returnPath(path(c)(x) - 1) = iterate_Path(path, x + 1, path(c)(x)) 
      ElseIf CInt(path(c)(x)) > UBound(returnPath) + 1 Then 
       ReDim Preserve returnPath(CInt(path(c)(x)) - 1) 
      End If 
     ElseIf CInt(path(c)(x)) > UBound(returnPath) + 1 Then 
      ReDim Preserve returnPath(CInt(path(c)(x)) - 1) 
      If x + 1 = UBound(path(c)) Then 
      returnPath(CInt(path(c)(x)) - 1) = iterate_Path(path, x + 1, path(c)(x)) 
      End If 
     ElseIf x + 1 = UBound(path(c)) Then 
      If CInt(path(c)(x)) > UBound(returnPath) + 1 Then 
       ReDim Preserve returnPath(CInt(path(c)(x)) - 1) 
      End If 
      returnPath(CInt(path(c)(x)) - 1) = iterate_Path(path, x + 1, path(c)(x)) 
     End If 
    Else 
     returnPath(CInt(path(c)(x)) - 1) = Empty 
    End If 
Next 
iterate_Path = returnPath 
End Function