Avatar billede george Nybegynder
30. april 2006 - 23:26 Der er 21 kommentarer og
1 løsning

Sortering af array

Function ShellSort(vArray)
Dim TempVal
Dim i, GapSize, CurPos
Dim FirstRow, LastRow, NumRows
FirstRow = LBound(vArray)
LastRow = UBound(vArray)
NumRows = LastRow - FirstRow + 1
Do
  GapSize = GapSize * 3 + 1
Loop Until GapSize > NumRows
Do
  GapSize = GapSize \ 3
  For i = (GapSize + FirstRow) To LastRow
  CurPos = i
  TempVal = vArray(i)
  Do While CompareResult(CDbl(vArray(CurPos - GapSize)),CDbl(TempVal))
    vArray(CurPos) = vArray(CurPos - GapSize)
    CurPos = CurPos - GapSize
    If (CurPos - GapSize) < FirstRow Then Exit Do
  Loop
  vArray(CurPos) = TempVal
  Next
Loop Until GapSize = 1
End Function

Function CompareResult(Value1, Value2)
CompareResult = (Value1 > Value2)
End Function


Jeg har denne kode til at sorter et array, men den komme med fejlen :
Microsoft VBScript runtime (0x800A000D)
Type mismatch: 'LBound'
/vl10/vaertskaber.asp, line 34

Linje 34 : FirstRow = LBound(vArray)

Her kaldet til ShellSort : ShellSort iData

Hvordan får jeg løst denne fejl ?

Er det en for dig eagleeye ;-)
Avatar billede erikjacobsen Ekspert
30. april 2006 - 23:31 #1
Din ShellSort skal vel være en Sub og ikke en Function
Avatar billede eagleeye Praktikant
30. april 2006 - 23:32 #2
Når den kommer med fejl i den linie lyder som om vArray ikke tolkes som et array.

og kaldet ser sådan her ud:  ShellSort iData

Nu kiggede jeg lige i et af de sidste par sprøgsmål og der hedder arrayey iDate så skulle der ikke havde stået?:

ShellSort  iDate
Avatar billede softspot Forsker
30. april 2006 - 23:34 #3
Umiddelbart er problemet af iData ikke er et array. Du kan teste om vArray er et array med funktionen isArray(vArray) inde i shellsort-funktionen inden du går igang med at bruge array-funktioner som lbound og ubound på den. Noget i stil med dette:

Function ShellSort(vArray)
Dim TempVal
Dim i, GapSize, CurPos
Dim FirstRow, LastRow, NumRows
if IsArray(vArray) then
FirstRow = LBound(vArray)
LastRow = UBound(vArray)
NumRows = LastRow - FirstRow + 1
Do
  GapSize = GapSize * 3 + 1
Loop Until GapSize > NumRows
Do
  GapSize = GapSize \ 3
  For i = (GapSize + FirstRow) To LastRow
  CurPos = i
  TempVal = vArray(i)
  Do While CompareResult(CDbl(vArray(CurPos - GapSize)),CDbl(TempVal))
    vArray(CurPos) = vArray(CurPos - GapSize)
    CurPos = CurPos - GapSize
    If (CurPos - GapSize) < FirstRow Then Exit Do
  Loop
  vArray(CurPos) = TempVal
  Next
Loop Until GapSize = 1
else
  ' meddel en fejl hvis vArray ikke er et array - man kunne også bare ignorere fejlen
  response.write "vArray er ikke et array"
end if
End Function

Function CompareResult(Value1, Value2)
CompareResult = (Value1 > Value2)
End Function
Avatar billede george Nybegynder
30. april 2006 - 23:34 #4
Jo selvfølgelig. Jeg venter lige på at jeg kan opdatere siden ;-)
Avatar billede george Nybegynder
30. april 2006 - 23:36 #5
Den kommer stadig med samme fejl. Jeg prøver lige at ændre ifølge erik
Avatar billede george Nybegynder
30. april 2006 - 23:38 #6
Kommer desværre med samme fejl Erik.
Avatar billede erikjacobsen Ekspert
30. april 2006 - 23:38 #7
Og så kan du med fordel sætte en "Option Explicit" i toppen af dine ASP sider  -  så brokker den sig hvis du bruger et navn du ikke har dimmet.
Avatar billede george Nybegynder
30. april 2006 - 23:40 #8
softspot >> jeg har brug den flere gange i løbet af dagen i forbindelse med GetRows og der virkede den fint.
Avatar billede erikjacobsen Ekspert
30. april 2006 - 23:40 #9
Du er sikker på du har en iDate som er et array?  Det med sub/function bør ikke gøre nogen forskel, det var mere for princippet.
Avatar billede softspot Forsker
30. april 2006 - 23:43 #10
Ja, men hvis du så finder dit array på en anden måde nu, kan det jo godt være blevet til et problem.

Rent bort set fra det, så er brugen af isArray i dette tilfælde også mere symptombehandling end problemløsning... :)
Avatar billede george Nybegynder
30. april 2006 - 23:43 #11
Hmm... det var det vi lige løste før hvor eagleeye også var med på sidelinjen.
Avatar billede softspot Forsker
30. april 2006 - 23:46 #12
Kan du ikke lige vise koden hvor du får fat i iDate (eller hvad den nu hedder)?
Avatar billede george Nybegynder
30. april 2006 - 23:52 #13
Koden ser sådan ud :

        'Create object for the recordset
        Set rs = Server.CreateObject("ADODB.RecordSet")

        'Create DSN connection
        strDSN = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ="&Server.MapPath("log/vl10.mdb")

        ' Opbygning af SQL streng
        strSQL = "SELECT * FROM Vaertskaber Where Aar =" & "'" & iAar & "'"
        'Response.Write(strSQL)
           
        'Open DB
        rs.Open strSQL, strDSN, 1

        'Make a loop finding the number of dates
        'i = 0
        'do while not rs.eof 'Looping rows
        '    iString = rs("Date")
        '    Response.Write iString & "<br>"           
        '    If iString <> "" Then
        '        i = i + 1
        '    End If
        '    rs.MoveNext
        'Loop
       
        'Make a loop finding the number of dates
        i = 0
        redim iDate(0)
        do while not rs.eof 'Looping rows
            iString = rs("Date")
            Response.Write iString & "<br>"         
            If iString <> "" Then
                i = i + 1
            redim preserve iDate(i)
            iDate(i-1)=iString
            End If
            rs.MoveNext
        Loop

        ShellSort iData

        Max = ubound(iDate)
        'Response.Write Max & "<br>"
     
        For i = 0 to Max
            Response.Write iDate(i) & "<br>"
        Next
       
        rs.close()
        Set rs = Nothing
Avatar billede erikjacobsen Ekspert
30. april 2006 - 23:53 #14
Der står stadig iData
Avatar billede george Nybegynder
30. april 2006 - 23:55 #15
Nu opdagede jeg selv fejlen. Jeg syntes lige jeg havde ændret "ShellSort iData" til "ShellSort iDate", men det var den ikke som du kan se.

Nu virker det.

Svar = Points for dem der er interesseret
Avatar billede softspot Forsker
30. april 2006 - 23:55 #16
ok, så hedder den altså iDate og linien

        ShellSort iData

skal ændres

        ShellSort iDate

Er det korrekt forstået, at du har prøvet dette, men at det ikke fungerede?
Avatar billede erikjacobsen Ekspert
30. april 2006 - 23:55 #17
:) Nej tak
Avatar billede george Nybegynder
30. april 2006 - 23:56 #18
1000 tak for hjælpen på det her ukristelige tidspunkt.
Avatar billede softspot Forsker
30. april 2006 - 23:57 #19
velbekomme :)
Avatar billede george Nybegynder
30. april 2006 - 23:57 #20
Softspot >> jeg mente jeg havde ændret det, men er lidt træt i øjnen efter en hel dags kodning ;-)
Avatar billede softspot Forsker
01. maj 2006 - 00:01 #21
Jeg kender det :)
Avatar billede george Nybegynder
01. maj 2006 - 09:02 #22
Lukker!
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