callByValue

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Dave
Beiträge: 1
Registriert: Fr Jul 01, 2011 4:58 pm

callByValue

Beitrag von Dave » Fr Jul 01, 2011 5:08 pm

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

Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: callByValue

Beitrag von fat-lobyte » Fr Jul 01, 2011 5:21 pm

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.
Haters gonna hate, potatoes gonna potate.

canlot
Beiträge: 393
Registriert: Di Mär 08, 2011 11:01 pm
Wohnort: NRW

Re: callByValue

Beitrag von canlot » Fr Jul 01, 2011 6:02 pm

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.
Unwissenheit ist ein Segen

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: callByValue

Beitrag von Xin » Fr Jul 01, 2011 6:48 pm

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Panke
Beiträge: 70
Registriert: So Nov 14, 2010 10:47 am

Re: callByValue

Beitrag von Panke » So Jul 10, 2011 2:04 pm

<klugscheißen>
In C gibt es nur CbV, da bei dem, was hier CbR heißt, Zeiger mit CbV übergeben werden.
</klugscheißen>

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: callByValue

Beitrag von cloidnerux » So Jul 10, 2011 2:16 pm

<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.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: callByValue

Beitrag von Xin » So Jul 10, 2011 2:29 pm

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten