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