Prosedyrer og funksjoner
- Oversikt
- Variabler
- Strenger
- Tall
- Boolsk
- Dato
- Tabeller
- Synlighet (scope)
- Konstanter
- Operatorer
- Flytkontroll
- Gjentakelser
- Prosedyrer og funksjoner
- Feilhandtering
- Annet
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). |