Zie ook: Functions and Subroutines, BYREF
function functionName(nul of meer namen van variabelen als parameter)
'code for the function goes in here
functionName = returnValueExpression
end function
Beschrijving:
Dit statement bepaalt een functie. De functie kan met een stringwaarde, of een numerieke waarde terugkeren.
Een functie die een stringwaarde terugkeert moet een naam hebben die met het "$" karakter beëindigt.
Een functie die een numerieke waarde terugkeert moet geen "$" in zijn naam omvatten.
Nul of meer parameters kunnen aan de functie worden meegegeven.
Een functie kan geen andere functiedefinitie, noch een subroutinedefinitie bevatten.
Merk op dat het haakje openen eigenlijk een deel van de functienaam is.
Zet geen spatie tussen de naam en het open haakje, of de code produceert een fout.
Goed:
function functionName(var1, var2)
Fout:
function functionName (var1, var2)
Terugkeren met een waarde
Om met een waarde van de functie terug te keren, wijs de waarde die van de functie ontvangen moet worden
toe aan een variabele met dezelfde naam als de functie. Als geen terugkeerwaarde
wordt gespecificeerd, dan zullen de numerieke en stringfuncties met
respectievelijk 0 en lege string terugkeren.
functionName = returnValueExpression
Lokale Variabelen
Elke variabele binnen een functie is plaatselijk geldig (local scope),
dat betekent dat de (lokale) waarde van de variabele binnen een functie,
verschilt van de waarde van een variabele met de zelfde naam buiten de functie.
Variabelen meegeven door een verwijzing (Passing by reference) naar een geheugen adres
Normaliter worden (de argumenten) variabelen die meegegeven worden aan een functie
als een vaste waarde "by value" doorgegeven hetgeen betekent dat een exemplaar
van de variabele in de functie wordt overgenomen.
We zagen reeds dat de waarde van de variabele niet veranderd in het hoofdprogramma
ook als het in de functie wel veranderd. De variabele in de functie was lokaal.
Een variabele kan in plaats daarvan echter ook "byref" worden meegegeven
wat betekent dat een verwijzing naar de daadwerkelijke variabele wordt meegegeven,
waardoor een verandering in de waarde van deze variabele in de functie
nu wel tevens de waarde van de variabele in het hoofdprogramma verandert.
Deze variabelen zijn (global scope)
Global Variables and Devices
Variabelen die met het GLOBAL statement worden gedeclareerd zijn beschikbaar
in het hoofdprogramma en in subroutines en functies.
Arrays, structs en handles van bestaande, DLLs en vensters zijn "global"
voor een Liberty BASIC programma, en zichtbaar binnen een functie
zonder de noodzaak ze special aan die functie mee te geven.
Speciale "global"status is gegeven aan enkele standaard variabelen die
gebruikt worden om de grootte, positie en kleur van vensters en controls te regelen.
Het betreft hier inclusief de variabelen voor
WindowWidth, WindowHeight, UpperLeftX, UpperLeftY, ForegroundColor$,
BackgroundColor$, ListboxColor$, TextboxColor$, ComboboxColor$, TexteditorColor$.
De waarde van deze variabelen, als ook die van DefaultDir$ en com
kunnen gezien worden en gewijzigd worden in elke subroutine/function.
Branch Labels
De aftak etiketten worden plaatselijk gezien.
De code binnen een functie kan geen aftak etiketten buiten de subroutine zien,
en de code buiten een functie kan geen aftak etiketten binnen
om het even welke subroutine zien.
End Function
Elke gedefinieerde functie moet eindigen met de uitdrukking "end function"
Exit Function
Elke functie kan voortijdig worden verlaten met de uitdrukking "exit function"
Executing Functions
Zorg ervoor dat een programma niet toevallig binnen een functie stroomt.
Een functie zou slechts moeten worden uitgevoerd wanneer het
op bevel van het programma wordt aangeroepen.
fout:
for i = 1 to 10
'do some stuff
next i
Function MyFunction(param1, param2)
'do some stuff
MyFunction=value
End Function
correct:
for i = 1 to 10
'do some stuff
next i
WAIT
Function MyFunction(param1, param2)
'do some stuff
MyFunction=value
End Function
Voorbeeld:
'count the words
input "Type a sentence>"; sentence$
print "There are "; wordCount(sentence$); " words in the sentence."
end
function wordCount(aString$)
index = 1
while word$(aString$, index) <> ""
index = index + 1
wend
wordCount = index - 1
end function
Zie ook: SUB , Recursion, Functions and subroutines
Function functionName(byref var1, byref var2$...)
Beschrijving: Variabelen worden standaard "by value" als argumenten aan functies en aan subs meegegeven, hetgeen betekent dat slechts een kopie van de variabele in de functie of sub wordt overgenomen. De waarde van de variabele wordt daardoor niet veranderd in het hoofdprogramma ook als het in de functie wel veranderd. Een variabele kan in plaats daarvan "byref" worden meegegeven, wat betekent dat een verwijzing naar de daadwerkelijke (geheugenplek) variabele wordt meegegeven, waardoor een verandering in de waarde van deze variabele in de functie of sub wel verandering van de waarde van de variabele in het hoofdprogramma geeft. Zie ook: Functie, Sub, Functies en Subroutines Gebruik: Elk van de parameters in de functie en sub in dit voorbeeld gebruikt de "byref" specificatie. Dit betekent dat wanneer de waarde van a en b in de functie worden veranderd dat dan ook de variabelen die worden gebruikt om de vraag (x en y) te maken zullen veranderen om op a en b te wijzen wanneer de functie terugkeert. Probeer door dit voorbeeld te stappen met debugger. 'now you can pass by reference x = 5.3 y = 7.2 result$ = formatAndTruncateXandY$(x, y) print "x = "; x print "y = "; y print result$ 'and it works with subroutines too wizard$ = "gandalf" call capitalize wizard$ print wizard$ end function formatAndTruncateXandY$(byref a, byref b) a = int(a) b = int(b) formatAndTruncateXandY$ = str$(a)+", "+str$(b) end function sub capitalize byref word$ word$ = upper$(left$(word$, 1))+mid$(word$, 2) end sub Meer over "pass by reference" Het meegeven "byref" wordt alleen ondersteund bij gebruik van string en numerieke variabelen als parameters. U kunt een numeriek of letterlijk string, of berekening van gegevens of een string meegeven, of zelfs een waarde van een array, maar de waarden zullen niet van de call terugkomen. Stap door het voorbeeld met de debugger om te zien hoe het werkt! 'you can also call without variables, but the changes 'don't come back result$ = formatAndTruncateXandY$(7.2, 5.3) print result$ 'and it works with subroutines too call capitalize "gandalf" a$(0) = "snoopy" call capitalize a$(0) end function formatAndTruncateXandY$(byref a, byref b) a = int(a) b = int(b) formatAndTruncateXandY$ = str$(a)+", "+str$(b) end function sub capitalize byref word$ word$ = upper$(left$(word$, 1))+mid$(word$, 2) end sub