Avatar billede kimlarsen1978 Nybegynder
03. juli 2007 - 15:25 Der er 15 kommentarer og
1 løsning

Array redim og funktion der returnere array

Hejsa
2 problemer...

1) Jeg kan ikke få redim at at virke for mit array, jeg har:
*************************
Function getArrOfURLs(strOmr, strPlace)
Dim arrUrlsToReturn()
redim arrUrlsToReturn(0,1)

sql select....

i = 0
Do Until rs.EOF
  if i <> 0 then
    'GØR PLADS TIL EN MERE
    'HAR PRØVET: redim arrUrlsToReturn(ubound(arrUrlsToReturn)+1,1), MEN DET VIRKER IKKE
  end if
  arrUrlsToReturn(i,0) = "" & rs("OmrNavn")
  arrUrlsToReturn(i,1) = basisURL & rs("mappe") & "/"
  i = i + 1
  rs.movenext
loop
getArrOfURLs = arrUrlsToRetur
End Function
*************************


2) Ovenstående array bliver lavet i en function som det ses. Men når jeg vil sætte en variabel = med det virker kun hvis der er 1 post i array'et er der mere en 1 kommer der ikke noget ud. Sådan her gør jeg:

*************
arrOmr = getArrOfURLs(rs("omraade"),"Artikler")
if isArray(arrOmr) then
  for i=lbound(arrOmr) to ubound(arrOmr)
    Response.Write arrOmr(i,0)
  Next
end if
**************

Dette er testet ved i funktionen at droppe redim og bare lave pladser nok Dim arrUrlsToReturn(100,1). Men jeg vil som sagt gerne at funktionen ved hjælp af redim opbygger at array med x poster "arrUrlsToReturn(x,1)", og at jeg derefter kan sætte en variabel = min funktion og udskrive arrayet.

Er det til at forstå?

Det har drillet mig meget så der er 200 point til den der lige ved hvordan, jeg får det til at hænge sammen :)
Avatar billede fennec Nybegynder
03. juli 2007 - 16:24 #1
Lige et par regler angående redim:

1. Hver gang man kalder redim slettes alle data medmindre der er Preserve påsat
2. Med Preserve kan man kun ændre den sidste dimension

Et par eks (single array):
dim tmpArr
reDim tmpArr(1)
tmpArr(0) = "hej"
tmpArr(1) = "med"
reDim tmpArr(2)
tmpArr(2) = "dig"

tmpArr indeholder nu kun "dig" i 2 index. 0 og 1 er tomme. Samme kode men med:
reDim Preserve tmpArr(2)
tmpArr(2) = "dig"

tmpArr indeholder nu hej, med, dig.

Multiarray:
dim tmpArr
reDim tmpArr(1,1)
tmpArr(0,1) = "hej"
tmpArr(1,1) = "med"
reDim Preserve tmpArr(2,1) '<-- ulovlig da man kun må ændre på sidste dimension med preserve
tmpArr(2,1) = "dig"

Det skal der i mod være:
dim tmpArr
reDim tmpArr(1,1)
tmpArr(1,0) = "hej"
tmpArr(1,1) = "med"
reDim Preserve tmpArr(1,2)
tmpArr(1,2) = "dig"

Din kode skal altså ændres til noget ala:
redim preserve arrUrlsToReturn(1,ubound(arrUrlsToReturn,2)+1)

Læg mærke til at uBound kaldes med parameteren 2. Det signallere 2 dimension. Den er default 1.

tmpArr(10,10,20,30)
response.write uBound(tmpArr) '<-- 10
response.write uBound(tmpArr,2) '<-- 10
response.write uBound(tmpArr,3) '<-- 20
response.write uBound(tmpArr,4) '<-- 30

Håber det hjælper på forståelsen af reDim af arrays :o)
Avatar billede fennec Nybegynder
03. juli 2007 - 16:30 #2
Du får lige et eks med en løkke også:

randomize
dim tmpArr
reDim tmpArr(1,0)
for f=1 to 10
    reDim Preserve tmpArr(1,ubound(tmpArr,2)+1)
    tmpArr(0,ubound(tmpArr,2)) = rnd()
    tmpArr(1,ubound(tmpArr,2)) = rnd()
next
Response.write "<table border=""1"">"
for f=0 to ubound(tmpArr,2)
    Response.write "<tr><td>"& tmpArr(0,f) & "</td>"
    Response.write "<td>"& tmpArr(1,f) & "</td></tr>"
next
Response.write "</table>"
Avatar billede kimlarsen1978 Nybegynder
03. juli 2007 - 16:36 #3
I det første siger du:
reDim tmpArr(1,1)

I det næste siger du
reDim tmpArr(1,0)

Hvad er forskellen og hvad er rigtigt?
Avatar billede kimlarsen1978 Nybegynder
03. juli 2007 - 16:40 #4
Når man gør sådan her:
for f=1 to 10
    reDim Preserve tmpArr(1,ubound(tmpArr,2)+1)
    tmpArr(0,ubound(tmpArr,2)) = rnd()
    tmpArr(1,ubound(tmpArr,2)) = rnd()
next
Springer man så ikke den første plads over?
Avatar billede kimlarsen1978 Nybegynder
03. juli 2007 - 16:50 #5
Nu har jeg gjort sådan her:

Dim arrUrlsToReturn()
redim arrUrlsToReturn(1,0)

Do Until rs.EOF
redim Preserve arrUrlsToReturn(1,ubound(arrUrlsToReturn,2)+1)
arrUrlsToReturn(0,ubound(arrUrlsToReturn,2)) = "" & rs("OmrNavn")
arrUrlsToReturn(0,ubound(arrUrlsToReturn,2)) = basisURL & rs("mappe") & "/"
rs.movenext
loop

og det ser ud til at virker, jeg forstår bare ikke hvorfor jeg ikke kommer til at springe den første post i arrayet over? Jeg har jo i starten re-dim'et den til at indholde 1 post også redim'er jeg den igen iden jeg fylder noget i??? Eller misforstår jeg noget?
Avatar billede fennec Nybegynder
03. juli 2007 - 16:52 #6
Det er bare forskellige eksempler. Begge er rigtige. Det handler om hvilken måde man "se" data.

Et array på 10,2 kan jo også være som 2,10.

Og jo, man springer den første plads over. Men det er nemmere at arbejde med rækker som begynder fra 1 i stedet for 0. Derfor burde jeg måske også have gjort det i udskrift eks:
for f=0 to ubound(tmpArr,2)
    Response.write "<tr><td>"& tmpArr(0,f) & "</td>"
    Response.write "<td>"& tmpArr(1,f) & "</td></tr>"
next

burde have været:
for f=1 to ubound(tmpArr,2)
    Response.write "<tr><td>"& tmpArr(0,f) & "</td>"
    Response.write "<td>"& tmpArr(1,f) & "</td></tr>"
next
Avatar billede kimlarsen1978 Nybegynder
03. juli 2007 - 16:54 #7
Ups, der skal selvfølgelig stå:
arrUrlsToReturn(0,ubound(arrUrlsToReturn,2)) =
arrUrlsToReturn(1,ubound(arrUrlsToReturn,2)) =

Men det ændre ikke ved min undren :-)
Avatar billede fennec Nybegynder
03. juli 2007 - 16:55 #8
Husk på at arrays er 0 indekseret:

dim arr(1,1)

har altså 4 data pladser:
arr(0,0) = ""
arr(0,1) = ""
arr(1,0) = ""
arr(1,1) = ""
Avatar billede kimlarsen1978 Nybegynder
03. juli 2007 - 17:00 #9
Ja, men derfor undre jeg mig også i starten siger vi

Dim arrUrlsToReturn()
redim arrUrlsToReturn(1,0)

Det må give et array
arrUrlsToReturn(0,0) = ""
arrUrlsToReturn(1,0) = ""

Også inden vi fylder data i den første plads laver vi en ny redim - hvorfor?
Avatar billede kimlarsen1978 Nybegynder
03. juli 2007 - 17:01 #10
Ender vi så ikke med en tom plads tilsidst?
Avatar billede kimlarsen1978 Nybegynder
03. juli 2007 - 17:13 #11
Og mit sidste spørgsmål:

hvorfor virker nedenstående kun når min funktion returnerer 1 post (hvis sql'en er tom), er der flere poster bliver der ikke skrevet noget ud?:

Function getArrOfURLs(strLokalomraader, strPlace)
Dim arrUrlsToReturn()
redim arrUrlsToReturn(1,0)
...
if not rs.eof then
...
else
  arrUrlsToReturn(0,0) = "NOMATCH"
  arrUrlsToReturn(1,0) = ""
  getArrOfURLs = arrUrlsToReturn
  exit function
end if
end function

************
arrOmr = getArrOfURLs(rs("omraade"),"Artikler")
if isArray(arrOmr) then
  Response.Write "<p>Se også:<br>"
  for i=lbound(arrOmr,2) to ubound(arrOmr,2)
    Response.Write "<a href="""& arrOmr(1,i) &""" class=""userLink"">» Område: " & arrOmr(0,i) & "</a><br>"
  Next
  Response.Write "</p>"
end if
Avatar billede kimlarsen1978 Nybegynder
03. juli 2007 - 18:28 #12
Er mit problem til at forstå eller er det sort?
Avatar billede kimlarsen1978 Nybegynder
03. juli 2007 - 19:10 #13
Problemet er sådan set bare at det jeg får retur fra funktionen i arrOmr får isArray(arrOmr) til at give false.

Hvorfor bliver arrOmr ikke til et array når funktionen returnerer et Array?
Avatar billede kimlarsen1978 Nybegynder
03. juli 2007 - 19:25 #14
fennec -> jeg vil gerne give dig poits som tak for hjælpen med det første, jeg har åbnet en ny vedr. det med funktionen: http://www.eksperten.dk/spm/786108

Men jeg undre mig fortsat over at vi ikke ender med en tom plads. I starten siger vi

Dim arrUrlsToReturn()
redim arrUrlsToReturn(1,0)

Det må give et array
arrUrlsToReturn(0,0) = ""
arrUrlsToReturn(1,0) = ""

Også inden vi fylder data i den første plads laver vi en ny redim - ender vi så ikke med en plads for meget?
Avatar billede kimlarsen1978 Nybegynder
03. juli 2007 - 20:11 #15
Som du kan se i http://www.eksperten.dk/spm/786108 var der en "dum" forklaring på at der ikke kom et array retur fra min funktion :)

Og der kommer altså en plads for meget i det array :)
Avatar billede fennec Nybegynder
04. juli 2007 - 13:52 #16
Undskyld jeg ikke har svaret før, men jeg har lagt mig syg :(
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester