2016-06-21 2 views
2

Ich brauche ein 2d Array, wobei die Länge des zweiten Arrays von Fall zu Fall variiert Basis. Zu diesem Zweck habe ich ein Array, die andere Arrays mit dem folgenden Code enthält:ASP Classic Wie man die Länge eines Arrays ändert, das von einem anderen Array gehalten wird (kein echtes 2d Array)

Dim timeline 
    ReDim timeline(days) 

    for reDate = beginDate to endDate 
     timeline(DateDiff("d", beginDate, reDate)) = Array(0) 
    next 

Das Problem, das ich habe, ist, daß ich nicht in der Lage bin die Größe jeder der Anordnungen nach zeitlichem Verlauf enthalten zu ändern, wie ReDim doesn Es scheint nicht zu funktionieren, wenn ich das tue. Weiß jemand, wie ich das machen würde?

Antwort

0

"Funktioniert nicht" und Fehlermeldungen ("Objekt erforderlich") ohne Code/Kontext sind nicht die beste Art, eine Frage zu stellen. Der erste ist eine völlige Zeitverschwendung; Der zweite Hinweis darauf, dass Sie Set verwendet haben, wo Sie nicht sollten (VBScript-Arrays sind keine Objekte, daher sollte im Code kein Set enthalten sein).

Dies zeigt die gleichen Fakten, die @omegastripes wies darauf hin, gibt aber Hinweise mögliche Gefahren wrt:

Option Explicit 

Dim AoA : AoA = Split("s o m e|w o r d s|o f|d i f f e r e n t|l e n g t h", "|") 
Dim i 
For i = 0 To UBound(AoA) 
    AoA(i) = Split(AoA(i)) 
Next 
WScript.Echo "----- test data:" 
For i = 0 To UBound(AoA) 
    WScript.Echo Join(AoA(i), "") 
Next 
WScript.Echo "----- array assignment copies (For Each elem ... does not 'work'):" 
Dim e 
For Each e In AoA 
    e = "zap" 
Next 
For Each e In AoA 
    WScript.Echo Join(e, "") 
Next 
WScript.Echo "----- array assignment copies (change needs index access):" 
For i = 0 To UBound(AoA) 
    e = AoA(i) 
    e(0) = UCase(e(0)) ' just changes the copy (e) 
    WScript.Echo Join(e, "") 
    AoA(i)(1) = UCase(AoA(i)(1)) ' access via indices changes org collection 
    WScript.Echo Join(AoA(i), "") 
Next 
WScript.Echo "----- replace whole subarrays (re-dimensioned dynamically):" 
Dim n, m 
For i = 0 To UBound(AoA) 
    e = AoA(i) 
    n = UBound(e) 
    ReDim Preserve e(n * 2 + 1) 
    For m = n + 1 To UBound(e) 
     e(m) = UCase(e(m - n - 1)) 
    Next 
    AoA(i) = e ' replace whole element 
    WScript.Echo Join(AoA(i), "") 
Next 

Ausgang:

cscript 37951664.vbs 
----- test data: 
some 
words 
of 
different 
length 
----- array assignment copies (For Each elem ... does not 'work'): 
some 
words 
of 
different 
length 
----- array assignment copies: 
Some 
sOme 
Words 
wOrds 
Of 
oF 
Different 
dIfferent 
Length 
lEngth 
----- replace whole subarrays: 
sOmeSOME 
wOrdsWORDS 
oFOF 
dIfferentDIFFERENT 
lEngthLENGTH 
1

Versuchen Sie, die unterhalb Schnipsel, Verwendung a als temporären Array variable:

Dim timeline, a 
ReDim timeline(days) 

' initial fill the array 
For reDate = beginDate to endDate 
    a = Array() 
    ReDim a(99) 
    timeline(DateDiff("d", beginDate, reDate)) = a 
Next 

' redim sub arrays 
For reDate = beginDate to endDate 
    ' assign subarray to a 
    a = timeline(DateDiff("d", beginDate, reDate)) 
    ' redim a 
    ReDim Preserve a(199) 
    ' put changed array into root array 
    timeline(DateDiff("d", beginDate, reDate)) = a 
Next 

In diesem Fall jedes Subarray ersten 100 Elemente enthält, und 200 nach ReDim.

+0

Würde nicht jeder sein, Sub-Array, so würde ich Tage haben Kopien von einem, anstatt Tage einzigartige Subarrays? Wie würde ich die Größe jedes einzelnen ändern, nachdem sie zugewiesen wurden? Ich bin mir nicht sicher, ob das wichtig ist, weil ich ein Object Required bekommen habe, als ich es trotzdem überprüfen wollte, haha – Naiya55

Verwandte Themen