Prosedyrer og funksjoner

From Apache OpenOffice Wiki
Jump to: navigation, search


Kodeblokker som utføres ofte kan legges inn i navngitte prosedyrer som kan påkalles av "klienter" ved behov. Vil en at den også skal regne ut noe er det en funksjon. Et godt oppdelt program er lettere å forstå og vedlikeholde.

Under vises to prosedyrer og en funksjon.

Sub visTemperatur
  ... viser temperaturen et sted
End Sub
 
Function dagensTemperatur As Double
  dagensTemperatur = 14.3 ' returverdi (en Double)
End Function
 
Sub C
   Dim t as Double
   visTemperatur()
   t = dagensTemperatur()
End Sub

Det er C som er "klient". Den påkaller visTemperatur, før den påkaller dagensTemperatur og legger returverdien inn i sin egen t.

Funksjoner som ikke har eksplisitt returverdi vil likevel returnere en default verdi (implisitt). Denne er 0 for tall eller "" for strenger. Hvis datatypen som skal returneres ikke er angitt, returneres en Variant.

Vil en avslutte prematurt brukes Exit Sub eller Exit Function, som i:

Sub Test
  Dim ErrorOccured As Boolean
  ...
  If ErrorOccured Then
    Exit Sub
  End If
  ...
End Sub

Parametre

Ofte vil man si nøyere hva prosedyren skal gjøre, og overfører da slik informasjon i ett eller flere parametre, som under der et heltall og en streng overføres.

Sub Test (A As Integer, B As String)
  ...
End Sub

Viktig er å merke seg at parametrene er pekere til "originalen", de er overført "by reference" og endringer i A og B er direkte på originalen.

Sub Test 
  Dim A As Integer
  A = 10
  ChangeValue(A)
  ' The parameter A now has the value 20
End Sub
 
Sub ChangeValue(TheValue As Integer)
  TheValue = 20
End Sub

Vil en sikre seg mot dette, overføres heller en kopi av parametret ved å angi "ByVal", som i:

Sub ChangeValue(ByVal TheValue As Integer)
  TheValue = 20
End Sub

Endringen over har ingen effekt på originalen.

En kan utelate parametre i påkallingen, hvis de er angitt som Optional, som under:

Sub Test(A As Integer, Optional B As Integer)
  ...
End Sub

Prosedyren kan sjekke om B ble forsynt med den boolske funksjon IsMissing, som i:

Sub Test(A As Integer, Optional B As Integer)
  Dim B_Local As Integer
  If Not IsMissing (B) Then   
    B_Local = B      ' B var angitt
  Else
    B_Local = 0      ' B ikke angitt, gi den en default verdi
  End If
  ...
End Sub

Rekursjon

En rekursiv prosedyre er en som påkaller seg selv, og fortsetter å gjøre det inntil en sluttbetingelse nås ("base condition"). Uten denne risikerer en at programmet krasjer grunnet plassmangel (hvert prosedyrekall krever noe lagerplass). Funksjonen "factorial" er et eksempel:

Sub Main
  Msgbox fact(  42 )    ' viser 1,40500611775288E+51
  Msgbox fact( -42 )    ' viser feilkode
  Msgbox fact( 3.14 )   ' viser feilkode
End Sub 
 
Function fact( n ) 
  If n < 0 or _                 ' ulovlig med negative tall
   ( n <> Int(n) ) Then         ' ulovlig med desimaltall
    fact = "fact: feil parameter"
  ElseIf n = 0 Then             ' sluttbetingelse
    fact = 1
  Else
    fact = n * fact ( n - 1 )   ' rekursivt
  Endif
End Function

Merk, at utregning av factorial er enklest med en iterasjon (ikke med rekursjon), som i

Function fact ( n )
  if n < 0 or n <> int (n) then 
    fact = "fact: feil parameter"
  else
    fact = 1
    for i = n to 1
      fact = fact * n
    next i
  end if
End Function

Merk, at

  • fact ikke har datatypen angitt for returverdi, altså returneres en Variant, som enten er en streng eller et tall.
  • datatypen for parameteret n er heller ikke angitt, noe som nok burde vært gjort. Med datatype Integer angitt ville en ikke behøve å sjekke for desimaltall (med n <> int(n)).
  • fact kan gi "seg selv" verdi flere ganger. Den siste verdien blir den som ved avslutning blir returnert til "klienten"


Content on this page is licensed under the Public Documentation License (PDL).
Personal tools