Variable as a reference or value to a function
#1
Today I looked at passing variables/arguments to functions - by reference and by value. QBasic Reference P. 2.31.

Apparently, passing by value doesn't work for functions.  Huh But with a procedure (Sub) it worked.

Value at Sub: The value is not changed
Code: (Select All)
'Beispiel fuer Uebergabe an Funktionen als Referenz und als Wert
'Funktioniert offenbar nicht mit Funktionen (?)
'17. Juli 2022

Option _Explicit

Declare Function AlsReferenz(eingabe as Integer) as Integer
Declare Sub AlsWert(eingabe as Integer) as Integer

Dim zahlref, zahlwert As Integer

Cls
Print
Print "Referenzbeispiel - Eingabe wird veraendert"
Input "Eingabe: ", zahlref

Print Using "Eingabe vor Funktionsaufruf: ###"; zahlref
Print Using "Eingabe nach Funktionsaufruf (Eingabe x 3): ###"; AlsReferenz(zahlref)

Print
Print "Wertbeispiel - Eingabe wird nicht veraendert"
Input "Eingabe: ", zahlwert

Print Using "Eingabe vor Funktionsaufruf: ###"; zahlwert

'Aufruf mit Wert in Klammern um sie zu einem Ausdruck zu machen
'QBasic Referenz S. 2.31
Call AlsWert((zahlwert))
Print Using "Eingabe nach Funktionsaufruf (Als Ausdruck): ###"; zahlwert

Print
Print "Uebergabe nicht als Ausdruck - keine Klammern (Eingabe + 3)."

'Jetzt nicht als Ausdruck: Ohne extra Klammern
'um die Variable wird die Eingabe veraendert, da
'sie jetzt wieder als Referenz (Standard) uebergeben wird.
Call AlsWert(zahlwert)
Print Using "Eingabe nach Funktionsaufruf: ###"; zahlwert

Function AlsReferenz (eingabe As Integer)

  AlsReferenz = eingabe * 3
End Function

Sub AlsWert (eingabe As Integer)

  'Hat nur Auswirkung, wenn Argument nicht als Ausdruck
  'uebergeben wird
  eingabe = eingabe + 3
End Sub

And now with a function: Passing by value doesn't work.
Code: (Select All)
'Beispiel fuer Uebergabe an Funktionen als Referenz und als Wert
'17. Juli 2022

Option _Explicit

Declare Function AlsReferenz(eingabe as Integer) as Integer
Declare Function AlsWert(eingabe as Integer) as Integer

Dim zahlref, zahlwert As Integer

Cls
Print
Print "Referenzbeispiel - Eingabe wird veraendert"
Input "Eingabe: ", zahlref

Print Using "Eingabe vor Funktionsaufruf: ###"; zahlref
Print Using "Eingabe nach Funktionsaufruf: ###"; AlsReferenz(zahlref)

Print
Print "Wertbeispiel - Eingabe wird nicht veraendert"
Input "Eingabe: ", zahlwert

Print Using "Eingabe vor Funktionsaufruf: ###"; zahlwert
Print Using "Eingabe nach Funktionsaufruf: ###"; AlsWert((zahlwert))

End 'Hauptprogramm

Function AlsReferenz (eingabe As Integer)

  AlsReferenz = eingabe * 3
End Function

Function AlsWert (eingabe As Integer)

  AlsWert = eingabe + 3
End Function
Reply
#2
(07-17-2022, 07:15 PM)Kernelpanic Wrote: Today I looked at passing variables/arguments to functions - by reference and by value. QBasic Reference P. 2.31.

Apparently, passing by value doesn't work for functions.  Huh But with a procedure (Sub) it worked.

Value at Sub: The value is not changed
Code: (Select All)
'Beispiel fuer Uebergabe an Funktionen als Referenz und als Wert
'Funktioniert offenbar nicht mit Funktionen (?)
'17. Juli 2022

Option _Explicit

Declare Function AlsReferenz(eingabe as Integer) as Integer
Declare Sub AlsWert(eingabe as Integer) as Integer

Dim zahlref, zahlwert As Integer

Cls
Print
Print "Referenzbeispiel - Eingabe wird veraendert"
Input "Eingabe: ", zahlref

Print Using "Eingabe vor Funktionsaufruf: ###"; zahlref
Print Using "Eingabe nach Funktionsaufruf (Eingabe x 3): ###"; AlsReferenz(zahlref)

Print
Print "Wertbeispiel - Eingabe wird nicht veraendert"
Input "Eingabe: ", zahlwert

Print Using "Eingabe vor Funktionsaufruf: ###"; zahlwert

'Aufruf mit Wert in Klammern um sie zu einem Ausdruck zu machen
'QBasic Referenz S. 2.31
Call AlsWert((zahlwert))
Print Using "Eingabe nach Funktionsaufruf (Als Ausdruck): ###"; zahlwert

Print
Print "Uebergabe nicht als Ausdruck - keine Klammern (Eingabe + 3)."

'Jetzt nicht als Ausdruck: Ohne extra Klammern
'um die Variable wird die Eingabe veraendert, da
'sie jetzt wieder als Referenz (Standard) uebergeben wird.
Call AlsWert(zahlwert)
Print Using "Eingabe nach Funktionsaufruf: ###"; zahlwert

Function AlsReferenz (eingabe As Integer)

  AlsReferenz = eingabe * 3
End Function

Sub AlsWert (eingabe As Integer)

  'Hat nur Auswirkung, wenn Argument nicht als Ausdruck
  'uebergeben wird
  eingabe = eingabe + 3
End Sub

And now with a function: Passing by value doesn't work.
Code: (Select All)
'Beispiel fuer Uebergabe an Funktionen als Referenz und als Wert
'17. Juli 2022

Option _Explicit

Declare Function AlsReferenz(eingabe as Integer) as Integer
Declare Function AlsWert(eingabe as Integer) as Integer

Dim zahlref, zahlwert As Integer

Cls
Print
Print "Referenzbeispiel - Eingabe wird veraendert"
Input "Eingabe: ", zahlref

Print Using "Eingabe vor Funktionsaufruf: ###"; zahlref
Print Using "Eingabe nach Funktionsaufruf: ###"; AlsReferenz(zahlref)

Print
Print "Wertbeispiel - Eingabe wird nicht veraendert"
Input "Eingabe: ", zahlwert

Print Using "Eingabe vor Funktionsaufruf: ###"; zahlwert
Print Using "Eingabe nach Funktionsaufruf: ###"; AlsWert((zahlwert))

End 'Hauptprogramm

Function AlsReferenz (eingabe As Integer)

  AlsReferenz = eingabe * 3
End Function

Function AlsWert (eingabe As Integer)

  AlsWert = eingabe + 3
End Function

You are not changing the values in the function.
b = b + ...
Reply
#3
This is not throwing errors in QB64??
Declare Function AlsReferenz(eingabe as Integer) as Integer
Declare Sub AlsWert(eingabe as Integer) as Integer

No it's not, but you can't use As Integer at end of Sub or Function. It must be that it is ignored by IDE.
b = b + ...
Reply
#4
If you want to pass by value, just use a different type than defined in sub or function.
b = b + ...
Reply
#5
Example:
Code: (Select All)
Dim ich As Integer
ich = 1
ichnicht ich
Print "from main ich is "; ich

Print "Call returns: "; ichSo%(ich)

Print "from main ich is "; ich

Sub ichnicht (i As Long)
    i = i * 10
    Print "from Sub i is "; i
End Sub

Function ichSo% (i As Long)
    i = i * 10
    Print "from Function i is "; i
    ichSo% = i
End Function
b = b + ...
Reply
#6
(07-17-2022, 07:35 PM)bplus Wrote: This is not throwing errors in QB64??
Declare Function AlsReferenz(eingabe as Integer) as Integer
Declare Sub AlsWert(eingabe as Integer) as Integer

No it's not, but you can't use As Integer at end of Sub or Function. It must be that it is ignored by IDE.

No, it will not be ignored. - According to the reference, it should. -- But it doesn't want to!  Tongue
Reply
#7
(07-17-2022, 07:41 PM)bplus Wrote: If you want to pass by value, just use a different type than defined in sub or function.
And then why does it work with the "Sub"?
Reply
#8
[Image: Referenz-Wert-QB64.jpg]
Reply
#9
(07-17-2022, 08:23 PM)Kernelpanic Wrote:
(07-17-2022, 07:41 PM)bplus Wrote: If you want to pass by value, just use a different type than defined in sub or function.
And then why does it work with the "Sub"?

It's exactly like bplus said. In the Sub you wrote this line:

Code: (Select All)
  eingabe = eingabe + 3

But in the Function you wrote this line:

Code: (Select All)
  AlsWert = eingabe + 3

The two pieces of code do fundamentally different things, because only the Sub actually assigns a new value to
eingabe
, the Function version leaves it alone. If you use the same line from the Sub in your Function then it should work as expected. Try changing it to this:

Code: (Select All)
  eingabe = eingabe + 3
  AlsWert = eingabe

It returns the exact same value as before, but also modifies
eingabe
to be the new value.
Reply
#10
When I pass something by value to a function or Sub(procedure), I work with a copy of the variable because I don't want it to change itself.
It doesn't seem to work with a function because the original variable is changed. The result is correct:
eingabe = 5
eingabe = eingabe + 3 -> 8
AlsWert = eingabe + 3 -> 11


[Image: Referenz-Wert-Funktion-QB64.jpg]
Reply




Users browsing this thread: 6 Guest(s)