byVal, byRef
byVal und byRef sind Schlüsselwörter die bei der Deklaration von Methoden verwendet werden können.
byVal
Der nachfolgende Parameter soll als Kopie der Methode übergeben werden (Vorgabe). Das Schlüsselwort „byVal“ ist damit im Grunde obsolet, da die Übergabe ohne Angabe von byVal oder byRef immer als Kopie erfolgt.
Kopie meint, dass die Quelle von der der Wert stammt unangetastet bleibt.
byRef
Der nachfolgende Parameter soll als Referenz der Methode übergeben werden.
Referenz meint, dass ein Adresszeiger auf das übergebene Objekt/Variable als Parameter der Methode übergeben wird und man den Wert des Objekts/der Variable innerhalb der Methode ändern kann.
Beim Aufruf dürfen dann als Übergabeparameter an die Methode nur einzelnde Objekte, Variablen oder Datenstrukturen übergeben werden. Ausdrücke können verständlicherweise nicht Referenziert werden.
Doppelte Deklarationen in Klassen
Werden Klassen verwendet, ist die doppelte Deklaration einer gleichnamigen Struktur in der Klasse und außerhalb der Klasse erlaubt, da es sich um getrennte Namensräume handelt.
Wird jedoch in der Klasse eine Methode mit byRef Statement verwendet, kann der Compiler nicht erkennen, um welche Struktur sich das übergebene Objekt handelt und meldet daher einen Kollisionsfehler. In solchen Fällen die Strukturdeklaration eines referenzierten Strukturtyps ausschließlich im Hauptprogramm vornehmen.
Parameter als Kopie übergeben
Beispiel 1:
' Hauptprogramm dim wert as integer dim s as string ausgabe("Meine Zahl: ",33) ' Aufruf des Unterprogramms ' Weitere Aufrufmöglichkeit wert = 12345 s = "Andere Zahl: " call ausgabe(s,wert) do loop ' Unterprogramm procedure ausgabe(text as string, a as byte) dim x as integer ' lokal gültige Variable x=a*100 print text+str(x) endproc
Parameter als Referenz übergeben
Beispiel 1: Variablen
dim a as byte a=23 test(a) print "a = ";str(a) ' Ausgabe: a = 42 do loop procedure test(byRef c as byte) print "c = ";str(c) ' Ausgabe: c = 23 c = 42 endproc
Beispiel 2: Strukturobjekte
struct point byte x byte y endstruct dim p as point p.x=23 test(p) print "p.x = ";str(p.x) ' Ausgabe: p.x = 42 do loop procedure test(byRef c as point) print "c.x = ";str(c.x) ' Ausgabe: c.x = 23 c.x = 42 endproc
Beispiel 3: Konstantenobjekte
test(text) ' Ausgabe: c.PString(0) = "hallo" test("ballo") ' Ausgabe: c.PString(0) = "ballo" do loop procedure test(byRef c as data) print "c.PString(0) = ";34;c.PString(0);34 endproc data text .db 5,"hallo" enddata
Beispiel 4: Arbeitsspeicherobjekte
dim a(127),i as byte for i=0 to a.Ubound a(i)=i next test(a()) do loop ' über Umweg Direktzugriff auf außenstehendes Array procedure test(byRef c as sram) dim i as byte for i=0 to 63 print str(c.ByteValue(i)) next endproc