12. august 2005 - 14:01Der er
51 kommentarer og 1 løsning
tilføje data til eksisterende array
Hej
Jeg har oprettet et array fra et records set vha. GetRow Nu vil jeg gerne kunne tilføje data til mit array - data kommer fra en anden kilde end databasen.
Jeg skal efterfølgende sortere i rækkefølgen (den tid, den sorg) Lige nu er det bare at kunne tilføre data til det eksisterende array.
Når jeg gør som du skriver, softspot får jeg denne fejl: Subscript out of range
Kan det være for jeg skal definere antallet af elementer første gang jeg definerer mit arr? Problemet er så bare at jeg ikke kender størrelsen på forhånd...
jeg ville umiddelbart mene at arrays defineret som varianter, der tager udgangspunkt i et array returneret fra en funktion som GetRow eller Split uden videre skal kunne redimensioneres som jeg viste, men det kan godt være jeg lige skal teste lidt på det. Jeg mener dog at der er den metode du skal bruge for at ændre på størrelsen af dine arrays...
jeg har ikke selv den store erfaring med brugen af ReDim Men jvnf http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/vsstmredim.asp så er det da muligt med flere dimensioner Vil tro du skal noget ala --- Først hive dine rækker ud arrRecords = rs.getrows() Dernæst så er første dimension på arrRecords dine kolonner, og anden dimension dine rækker antalCols = Ubound(arrRecords,1) + 1 antalRows = Ubound(arrRecords,2) + 1 Så burde du lave en ekstra række i arrayet ved ReDim Preserve arrRecords(antalCols, antalRows + 1)
softspot >> nu er jeg ikke så spids i flerdimensionale arrays heller ;o) . men dit array er vist ikke 2 dimensionalt på samme måde..er det? kan du kalde fx response.write ar2(0,1) ?
busschou >> nææh, det har du faktisk ret i. Det betyder så også at man ikke kan tilføje flere rækker i sit array, da man ikke kan ændre på andre end den sidste dimension uden at slette data (hvis jeg har forstået den beskrivelse på MSDN du henviser til)...
busschou >> ...men hvis jeg så læste hvad du skrev, så er vender arrays som GetRows returnerer åbenbart omvendt (måske af samme årsag... hmmm), så det rent faktisk ikke er et problem at tilføje nye rækker. :)
godmorgen, blev ski for træt igår :o) Ja det burde være muligt, det eneste er om antallet er lig Ubound eller om der skal lægges en til, kom jeg i tvivl om
arrays i VBScript er altid 0-baseret og ubound er derfor antallet af elementer minus 1, dvs. for at få udvidet array'et med en skal man lægge 1 til ubound af array'et.
softspot >> jeps visse ting er jeg elendig til at huske, mange andre programmeringsprog giver man jo arrayet størrelse 10 for at det skal indeholde 10 elementer nummereret fra 0-9, i asp giver man det så størrelsen 9 og får 10 elementer nummereret fra 0-9, lidt ulogisk synes jeg :o) Så ja jeg har lagt en for meget til
Igen har jeg intet testet, slog det blot op fordi jeg engang havde læst om den der GetRows metode i noget menu halløj. Men jeg tror altså ikke du skal resize den anden dimension for hver kolonne! Man kan jo opfatte fler dimensionale arrays som flerdimensionale matricer. Hvis du har et myArr(3,10) så giver det ikke mig mening at resize som du gør i alle tre kolonner, da de nødvendigvis må følges ad Hmm hvordan katten forklarer man det som jeg tænker :o) --- hvis udgangspunktet er sådan her tre col og 10 rows XXXXXXXXXX XXXXXXXXXX XXXXXXXXXX --- Så giver det ingen mening på noget tidspunkt at have det sådan her --- XXXXXXXXXXX XXXXXXXXXX XXXXXXXXXX ---
sådan her ---- antalCols = Ubound(arrRecords,1) antalRows = Ubound(arrRecords,2) ReDim Preserve arrRecords(antalCols, antalRows + 1) ---- Vil også svare til microsofts eksempel ala Dim myArr(3,10) Redim Preserve myArr(3,11) hvorved den anden koordinat (dimension) for alle første koordinater resizes
softspot >> desuden tror jeg ikke din "antalCols = Ubound(arrRecords)" går. For da arrRecords er todimensional skal den jo vide hvilken dimension den skal måle, hvis du bare gør som du gør der, så vil jeg tro at antalCols bliver lig 2 netop fordi den er todimensional, mens Ubound(arrRecors,1) vil kunne give fx 5 hvis der er 5 kolonner og Ubound(arrRecords,2) vil kunne give fx 10 hvis der er 10 rækker :o)
busschou >> Det kan du da have ret i. Jeg tror stadig jeg havde mit eget eksempel i hovedet (hvor hvert enkelte element i arrayet var et array som så skulle have været omdimensioneret hver for sig). 2D-arrays er naturligvis en sammenhængende matrise der skaleres som en enhed...
busschou >> mht. din kommentar fra 10:36:03, så synes jeg lige vi blev enige om at 2D-arrays altid havde det samme antal elementer i den påg. dimension, så hvis jeg måler ubound(arrRecords) betyder det at jeg tager antallet af elementer i den første dimension og hvis jeg tager ubound(arrRecords(0)) så er det antallet af elementer i den anden dimension...
njaa du kan se scenariet ved at køre denne her test som burde illustrere det dog giver den en fejl ved ReDim fordi arraet er låst, måske du ved hvorfor den gør det? --- <% Dim myArr(3,10) response.write "FØR: <br>" response.write "ubound(myArr) = "&ubound(myArr)&"<br>" response.write "ubound(myArr,1) = "&ubound(myArr,1)&"<br>" response.write "ubound(myArr,2) = "&ubound(myArr,2)&"<br>" for i=1 to 3 for j=1 to 10 myArr(i,j) = i&","&j next next for i=1 to 3 for j=1 to 10 response.write myArr(i,j)&" " if j=10 then response.write "<br>" end if next next response.write "EFTER: <br>" ReDim Preserve myArr(3,11) response.write "ubound(myArr) = "&ubound(myArr)&"<br>" response.write "ubound(myArr,1) = "&ubound(myArr,1)&"<br>" response.write "ubound(myArr,2) = "&ubound(myArr,2)&"<br>" for i=1 to 3 for j=1 to 10 response.write myArr(i,j)&" " if j=10 then response.write "<br>" end if next next %>
hmm lader til at være noget underligt noget, for at kunne lave en ReDim skal arrayet være defineret som dynamisk og må derfor ikke været lavet som Dim myArr(3,10) men skal laves uden størrelser, men man kan ikke Dim´e et todimensionalt array uden angive størelserne, så det er da et dilemma Dog kan det være det er muligt du kan gøre det ønskede med getRows fordi den ikke er dim´et med størrelser
Det er fordi du skal starte med at erklære array'et med ReDim-kommandoen (blot uden Preserve). Dit eksempel vil altså komme til at se således ud:
ReDim myArr(3,10) response.write "FØR: <br>" response.write "ubound(myArr) = "&ubound(myArr)&"<br>" response.write "ubound(myArr,1) = "&ubound(myArr,1)&"<br>" response.write "ubound(myArr,2) = "&ubound(myArr,2)&"<br>" for i=1 to 3 for j=1 to 10 myArr(i,j) = i&","&j next next for i=1 to 3 for j=1 to 10 response.write myArr(i,j)&" " if j=10 then response.write "<br>" end if next next
response.write "EFTER: <br>"
ReDim Preserve myArr(3,11) response.write "ubound(myArr) = "&ubound(myArr)&"<br>" response.write "ubound(myArr,1) = "&ubound(myArr,1)&"<br>" response.write "ubound(myArr,2) = "&ubound(myArr,2)&"<br>" for i=1 to 3 for j=1 to 10 response.write myArr(i,j)&" " if j=10 then response.write "<br>" end if next next
ok så lærte jeg også lidt, jeg troede ikke man kunne benytte en Redim uden først benytte en dim :o) Følgende illustrerer vel så meget godt hvordan et to dimensionalt array er bygget op Og det viser samtidig også at min kommentar 12/08-2005 23:51:13 kan benyttes pånær der ikke skal lægges een til hver ubound værdi --- koden --- <% ReDim myArr(3,10) response.write "FØR: <br>" response.write "ubound(myArr) = "&ubound(myArr)&"<br>" response.write "ubound(myArr,1) = "&ubound(myArr,1)&"<br>" response.write "ubound(myArr,2) = "&ubound(myArr,2)&"<br>" for i=0 to ubound(myArr,1) for j=0 to ubound(myArr,2) myArr(i,j) = i&","&j next next for i=1 to 3 for j=1 to 10 response.write myArr(i,j)&" " if j=10 then response.write "<br>" end if next next
det ses at den anden dimension sættes på samtlige første dimensioner ( hvis man kan sige det ) Men det ses også at ubound(arr) hvor arr er to dimensional ikke som jeg troede returnerer dimensionen på arr men returnerer størrelsen på første dimensionen --- lmejding >> håber ikke al den snake her har forvirret dig :o)
øøøøhhh - jo, jeg er nok en anelse forvirret. Det er lidt svært at følge med i jeres snak - men jeg er jer taknemmelig og vil nu prøve at lege lidt med jeres eksempler - foreløbigt tak...
ok vi var også lidt forvirrede tror jeg ;o) Men humlen vi kom frem til er at du kan gøre følgende ---- ' Først hive rækkerne ud i et to dimensionalt array myArr = rs.getRows() ' Dernæst indeholder følgende to variable hvor mange kollonner og rækker du har antalCols = Ubound(arrRecords,1) antalRows = Ubound(arrRecords,2) ' Du tilføjer til sidst en ekstra række sådan her ReDim Preserve myArr(antalCols, antalRows + 1) ---- Det kan være lidt tricky at forstå de her flerdimensionale arrays, så hvis det er helt galt så kig evt på linket fra min kommentar 12/08-2005 23:45:16 hvor de netop benytter getRows()
Jeg henter rs vha Get row. Jeg skal kun bruge een værdi nemlig menu_sorting Jeg kan også få data skrevet ud efter de er lagt ind i mit array. jeg kan også få tilføjet et nyt element til mit array, som du beskriver busschou, men jeg kan ikke få lov at tildele en værdi til den nye element. Jeg får en out of range fejl:
Set rs = Conn.Execute("Select menu_sorting from sider Where menuer_dir='"&indhold&"/'") ' Først hive rækkerne ud i et to dimensionalt array myArr = rs.getRows() Set rs = nothing
' Dernæst indeholder følgende to variable hvor mange kollonner og rækker du har antalCols = Ubound(myArr,1) antalRows = Ubound(myArr,2) response.write "kolloner"& antalCols &"<br>" response.write "rækker"& antalRows &"<br>"
response.write "FØR: <br>"
for i=0 to ubound(myArr,1) for j=0 to ubound(myArr,2) response.write myArr(i,j)&" , " next next response.write "<br><br>"
' Du tilføjer til sidst en ekstra række sådan her ReDim Preserve myArr(antalCols, antalRows + 1 ) 'myArr(ubound(myArr)) = "12" (denne linie skaber fejlen) response.write "Efter: <br>" response.write "ubound(myArr) = "&ubound(myArr)&"<br>" response.write "ubound(myArr,1) = "&ubound(myArr,1)&"<br>" response.write "ubound(myArr,2) = "&ubound(myArr,2)&"<br>"
for i=0 to ubound(myArr,1) for j=0 to ubound(myArr,2) response.write myArr(i,j)&" , " next next%> -------------------------- Out come:
Select * from sider Where menuer_dir='/nyt_site/mappe1/' kolloner0 rækker2 FØR: 8 , 10 , 11 ,
det er fordi dit array er to dimensionalt I dit tilfælde har du een kolonne og tre rækker (ps jeg kan godt se det er forvirende når nu din udskrift viser een række med tre kolonner, men det er fordi det er vendt på hovedet) Anyways Du kan ikke gøre sådan her myArr(ubound(myArr)) = "12" fordi du skal angive begge dimensioner og du har kun angivet den anden prøv derfor med myArr(1,ubound(myArr)) = "12" hvilket burde indsætte 12 i første kolonne fjerde række
øhh bøhh Det er selvfølgelig klart at jeg ikke kan tælle ;o) Og det er klart at den første plads i et array er den "nulte" plads, så det er rigtig nok at du har rettet det til 0 -- At den så gør sådan at den nye værdi kommer på den første plads undrer mig hm og dog Det er jo fordi din ubound også skal have dimensionen med selvfølgelig :o) --- myArr(0,ubound(myArr,2)) = "12"
Jeg skal bruge denne ting flere gang efter hinanden - fordi jeg henter de nye data fra forskellige kilder. Skal jeg så bare gentage (sætte i en function):
ja men det virker kun såfremt du kun henter een kolonne ud af din database Hvis du henter to kolonner ud, så skildner den så imellem de to på første koordinatet --- myArr(0,sidste_plads) = "Jeg sættes ind i første kolonnes sidste række" myArr(1,sidste_plads) = "Jeg sættes ind i anden kolonnes sidste række" --- Men ellers ja :o)
Ja, ok, men jeg satte koden ind to gange efter hianden - bare for at se om den blev forlænget - men det blev den ikke - arrayet blev ikke forlænget og den nye værdi blev sat ind på pladsen fra tidligere...
hvor om alting er: Tak for din tid og store hjælp - også tak til softspot
du skal have det hele med før det virker, for hvis du genbruger antalCols og antalRows, så er de jo stadig 0 og 4, men gangen efter skal de jo være 0 og 5 --- altså i en funktion --- Sub insert(arr,elm) ReDim Preserve arr(ubound(arr,1),ubound(arr,2)+1) arr(0,ubound(arr,2)) = elm End Sub --- Den burde du så kunne kalde igen og igen --- myArr = rs.getRows() call insert(myArr,"12") call insert(myArr,"3") osv ---
Jeg skal nu videre med mit projekt og er kommet til at skulle sortere mit array nummerisk. Jeg fandt et script på nettet, der skulle hjælpe mig med opgaven, men jeg får: Subscript out of range: 'myArr'
For i=0 to ubound(myArr,1) For j=i+1 to ubound(myArr,1) if myArr(i)>myArr(j) then TemporalVariable=myArr(i) myArr(i)=myArr(j) myArr(j)=TemporalVariable end if next next
Response.write ("The sorted values are those ones: <BR>")
For i=0 to ubound(myArr,1) Response.write (myArr(i) & "<BR>") next
mon ikke det er fordi du skal huske dine dimensioner:
For i=0 to ubound(myArr,1) For j=i+1 to ubound(myArr,1) if myArr(0,i)>myArr(0,j) then TemporalVariable=myArr(0,i) myArr(0,i)=myArr(0,j) myArr(0,j)=TemporalVariable end if next next
Response.write ("The sorted values are those ones: <BR>")
For i=0 to ubound(myArr,1) Response.write (myArr(0,i) & "<BR>") next
For i=0 to ubound(myArr,2) For j=i+1 to ubound(myArr,2) if myArr(0,i)<myArr(0,j) then TemporalVariable=myArr(0,i) myArr(0,i)=myArr(0,j) myArr(0,j)=TemporalVariable end if next next
Response.write ("The sorted values are those ones: <BR>")
for i=0 to ubound(myArr,1) for j=0 to ubound(myArr,2) response.write myArr(i,j)&" , " next next
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.