Seite 1 von 1

callByValue

Verfasst: Fr Jul 01, 2011 5:08 pm
von Dave
Hallo!
Ich mache z.Z. das C-Tutorial dieser Seite und mir wird partout nicht der Sinn von callByValue deutlich.
Ich weiß, dass dabei Daten direkt übergeben werden, aber ich versteh nicht was callByValue() ansich sein soll. Ist es eine Funktion, die in irgendeiner Library steht? Warum benutz man sie?

vg und danke schonmal!
dave

Re: callByValue

Verfasst: Fr Jul 01, 2011 5:21 pm
von fat-lobyte
Dave hat geschrieben:Hallo!
Ich mache z.Z. das C-Tutorial dieser Seite und mir wird partout nicht der Sinn von callByValue deutlich.
Ich weiß, dass dabei Daten direkt übergeben werden, aber ich versteh nicht was callByValue() ansich sein soll. Ist es eine Funktion, die in irgendeiner Library steht? Warum benutz man sie?

vg und danke schonmal!
dave
Das ist die Art, wie man einer Funktion Parameter überreicht.
Call By Value bedeutet, dass die Daten eben _nicht_ direkt übergeben werden, sondern für die Funktion einfach kopiert.
Call By Reference bedeutet, dass die Daten nicht kopiert werden, sonder nur der "Verweis" darauf. (Wenn du schon was von Zeigern gehört hast: dabei werden Zeiger verwendet).

Einen unterschied macht das bei:

* Großen Daten: diese zu kopieren kostet Zeit und speicherplatz
* Werten die innerhalb der aufgerufenen Funktion verändert werden: bei Call by Value bleiben die Änderungen nicht erhalten (ist ja nur eine Kopie), bei Call by Reference jedoch schon.

Re: callByValue

Verfasst: Fr Jul 01, 2011 6:02 pm
von canlot
Noch mal für Anfänger :D
callByValue: du übergibst die Werte der Variablen an die Funktion, die mit den Werten arbeitet. außerhalb der Funktion bleiben die Werte unverändert. d.h: in der Funktion darfst du mit den Werten machen was du möchtest, nach Ablauf der Funktion werden die übergegebene Werte in der Hauptfunktion nicht verändert.
Dave hat geschrieben:callByValue()
diese Funktion gibt es nicht. D.h. dass die Werte einfach aus der Hauptfunktion für die deine Funktion kopiert werden.

Re: callByValue

Verfasst: Fr Jul 01, 2011 6:48 pm
von Xin
Dave hat geschrieben:Hallo!
Ich mache z.Z. das C-Tutorial dieser Seite und mir wird partout nicht der Sinn von callByValue deutlich.
Hi, ich schreibe das Tutorial, daher erstmal danke für das Feedback. :-)

Hier ist ein Link zu betreffenden Seite im Wiki.
(denke ich, hier geht's um's C++-Tutorial!?)
Dave hat geschrieben:Ich weiß, dass dabei Daten direkt übergeben werden, aber ich versteh nicht was callByValue() ansich sein soll. Ist es eine Funktion, die in irgendeiner Library steht? Warum benutz man sie?
Call-By-Value sagt aus, dass die Parameter für den Funktionsruf kopiert werden, was bei der Funktion mit dem Namen "CallByValue" eben der Fall ist.

Die Funktion CallByValue() ist eine im Tutorial definierte Funktion, sie hat auch keinen nennenswerten Sinn, weil sie nur als Beispiel für Parameter herhält, die per Call-By-Value übergeben werden. Sie soll nur verdeutlichen, was der Unterschied zwischen den einzigen Übergabemöglichkeiten ist.

Die Funktion existiert nur daher, da ich sie im Tutorial angelegt habe und gehört zu keiner Library und könnte auch jeden beliebigen anderen Namen tragen.


Bitte verwende eine gültige E-Mail-Adresse.

Re: callByValue

Verfasst: So Jul 10, 2011 2:04 pm
von Panke
<klugscheißen>
In C gibt es nur CbV, da bei dem, was hier CbR heißt, Zeiger mit CbV übergeben werden.
</klugscheißen>

Re: callByValue

Verfasst: So Jul 10, 2011 2:16 pm
von cloidnerux
<klugscheißen>
In C gibt es nur CbV, da bei dem, was hier CbR heißt, Zeiger mit CbV übergeben werden.
</klugscheißen>
Klugscheißer-mode:
Es geht bei Call-By-Reference nicht darum, das da auch wieder nur irgendwelche Werte übergeben werden, sondern das du nicht so viel Kopieren musst.
Stell dir mal vor, du hast eine Struktur, die 1Gb groß ist und dann willst du die über CbV übergeben -> unötige Verschwendung von resourcen.
Wenn du das aber per CbR übergibst, hast du nen 4/8Byte Pointer der auf die Struktur verweist -> Schon besser.

Re: callByValue

Verfasst: So Jul 10, 2011 2:29 pm
von Xin
cloidnerux hat geschrieben:
<klugscheißen>
In C gibt es nur CbV, da bei dem, was hier CbR heißt, Zeiger mit CbV übergeben werden.
</klugscheißen>
Klugscheißer-mode:
Es geht bei Call-By-Reference nicht darum, das da auch wieder nur irgendwelche Werte übergeben werden, sondern das du nicht so viel Kopieren musst.
Stell dir mal vor, du hast eine Struktur, die 1Gb groß ist und dann willst du die über CbV übergeben -> unötige Verschwendung von resourcen.
Wenn du das aber per CbR übergibst, hast du nen 4/8Byte Pointer der auf die Struktur verweist -> Schon besser.
Bei Call-By-Reference geht es erstmal darum, dass die Daten nicht kopiert werden, damit man sie zum Beispiel ändern kann. Von der Implementierung in C hat Panke aber recht: C kennt keine Referenzen und auch kein Call-By-Reference. Dafür kannst Du in C Dir Zeiger von Variablen geben lassen und dann die Zeiger per Call-By-Value übergeben. Damit löst man das Problem, dass man kein CbR zur Verfügung hat.
Das ist aber eben nicht das gleiche, denn eine Variable, die per Call-By-Reference übergeben wird, muss existieren, sonst könnte man sie nicht referenzieren, während der Zeiger auch ein Null-Pointer sein kann.

Deswegen ist Java und C# ja eigentlich auch so krank, weil dort von "Referenzen" gesprochen wird, aber alles nur über Pointer behandelt wird, die man ständig gegen "null" prüfen muss.