Diskussion:Referenz (Programmierung)

Letzter Kommentar: vor 6 Monaten von Uli Cl in Abschnitt Beispiel in Pascal, by value: Rückgabewert fehlt

Abschnitt: Eigenschaften

Bearbeiten

Vielleicht wäre es sinnvoll den Artikel noch um einen Abschnitt "Eigenschaften" zu erweitern, der Vor- und Nachteile, sowie Anwendungsmöglichkeiten (Parameter-Übergabe "Call by Reference", komplexe Rückgabewerte (von Subroutinen in Perl); komplexe Datentypen (in Perl)) aufzeigt analog zu dem umfangreicheren Artikel "Zeiger (Informatik)".

Ein Beispiel in Perl wäre ebenfalls wünschenswert:

Referenzieren                ... und Dereferenzieren

- von Skalaren               - von Skalaren
  my $scalarRef = \$scalar;    my $scalar = ${$scalarRef};
- von Arrays                 - von Arrays
  my $arrayRef  = \@array;     my @array  = @{$arrayRef};
- von Hashes                 - von Hashes
  my $hashRef   = \%hash;      my %hash   = %{$hashRef};
- von Subroutinen            - von Subroutinen
  my $subrtRef  = \&subrt;     my &subrt  = &{$subrtRef};

(Der vorstehende Beitrag stammt von 134.176.72.134 – 14:29, 16. Jan. 2007 (MEZ) – und wurde nachträglich signiert.)

Verständlichkeit

Bearbeiten

Also ich fänd's wirklich nett die ersten Sätze allgemeinverständlicher zu formulieren. "Referenz" ist ja schon ein Informatik-Begriff der mal Nichtinformatikern in die Wege kommt: "Eine Referenz repräsentiert einen Verweis auf ein Objekt. Wie der Zeiger stellt eine Referenz damit einen Aliasnamen für eine Entität dar, d. h. eine Variable, die die Speicheradresse einer anderen Variablen enthält."
(Der vorstehende Beitrag stammt von Saule – 16:15, 31. Jul. 2008 (MESZ) – und wurde nachträglich signiert.)

Tja, das ist schon ziemlich abstrakt formuliert, aber zumindest korrekt. Mir fällt da jetzt erstmal nicht ein, wie man das noch weiter vereinfachen könnte, ohne dass es falsch wird. --j ?! 17:19, 31. Jul. 2008 (CEST)Beantworten

Im zweiten Satz steht "wie der Zeiger", das kompliziert unnötig für den Nichtinformatiker... Eine Referenz stellt damit einen Aliasnamen (Umschreibung? mit einfachen Worten) für eine Entität (Umschreibung? mit einfachen Worten) dar. Es handelt sich um eine Variable die die Speicheradresse (Umschreibung bsw. mit Inhalt?) für eine andere Variable enthält. So vielleicht?
Wenn ich das jetzt richtig verstanden habe: Eine Referenz ist eine Variable die den Inhalt einer anderen Variable enthalten kann.
Was ist dann der Unterschied zu einem Zeiger? Vermutlich ein feststehender Wert der den Inhalt einer anderen Variablen enthalten kann.
(Der vorstehende Beitrag stammt von Saule – 13:55, 14. Aug. 2008 (MESZ) – und wurde nachträglich signiert.)

verborgen

Bearbeiten

Wie ist das „Im Gegensatz zu expliziten Zeigern ist die Adresse selbst nicht mehr änderbar und verborgen“ zu verstehen? in C++ kann ich doch mit &var jederzeit die Adresse abfragen? inwiefern ist sie also verborgen? --141.53.216.143 12:40, 6. Mär. 2013 (CET)Beantworten

Beispiel:
int i=123; int& ref=i;  cout << "Adresse von i:" << &i << ", Adresse von ref:" << &ref << '\n';
Da wird nicht die Adresse von 'ref' ausgegeben, sondern eben von 'i', da 'ref' keine eigene Adresse hat. 'ref' ist nur ein "Aliasname" für 'i'.
--RokerHRO (Diskussion) 22:57, 6. Mär. 2013 (CET)Beantworten

Starke und schwache Referenzen

Bearbeiten

Die beiden Begriffe starke und schwache Referenz könnten vielleicht hier – im Artikel – noch etwas besser beschrieben werden (z.B. was denn genau das Unterscheidungsmerkmal oder -kriterium ist). Zu letzterem, also die schwache Referenz, gibt es in der englischen Wikipedia übrigens einen ganzen Artikel (siehe en:weak reference) sowie auch einen Miniartikel zum Gegenteil (siehe en:strong reference). Und da ich zur Zeit keinen Grund sehe, daß dafür extra ein (oder gar zwei) ganze(r) Artikel hier (in der deutschsprachigen Wikipedia) angelegt werden, die Lemmas jedoch auch gefragt sind,[1] habe ich dazu nun lediglich zwei Weiterleitungen hier her angelegt.
--Konrad14:11, 11. Jul. 2011 (CEST)Beantworten

Beispiel in C++

Bearbeiten

Ich finde das arg unglücklich. In C++ sind Referenzen einfach nur Aliasnamen auf bestehende Objekte. Andere Erklärungsversuche führen dagegen regelmäßig zu Verwirrungen und daher würd ich sie lieber unterlassen. --RokerHRO 18:03, 7. Nov. 2011 (CET)Beantworten

Gleichsetzung Referenzen -> Call by Reference ist fatal

Bearbeiten

Im Artikel liest sich das so, als sei die Übergabe von Referenzen dasselbe wie Call by Reference. Insgesamt habe ich den Eindruck, dass hier Referenzsemantik und CbR heillos durcheinanergeworfen werden. Das ist aber nicht korrekt. So sind z.B. Java und Smalltalk beides Sprachen, die zwar i.A. Referenzsemantik verwenden, aber beide kennen kein Call by reference sondern ausschließlich Call by value. Kaktus 02:07, 22. Jan. 2012 (CET)Beantworten

Java macht "Call by value", richtig. Allerdings ist der Value, der bei Objekten übergeben wird, eben eine Referenz auf das Objekt, so dass die aufgerufene Funktion das übergebene Objekt nach Belieben ändern kann (zumal es in Java auch kein const gibt). --RokerHRO 21:01, 23. Jan. 2012 (CET)Beantworten

Nicht ganz

Bearbeiten

1. Sie können das Objekt selbst nicht ändern, sondern nur dessen Zustand. Anders ausgedrückt: Ein Ersetzen des Objekts, dass sich auch außerhalb der Methode auswirken würde, ist nicht möglich. Genau das ist der wesentliche Unterschied zu CbR.

2. Die Änderung des Zustandes kann nicht "nach Belieben" rfolgen, sondern lediglich über die von dem Objekt bereitgestellte Schnittstelle. (nicht signierter Beitrag von Kaktus (Diskussion | Beiträge) 11:45, 20. Nov. 2013 (CET))Beantworten

Beispiel in Pascal, by value: Rückgabewert fehlt

Bearbeiten

In dem 2. Beispiel "by value" kann das Ergebnis (wie im Artikel beschrieben) nicht über die Parameterliste zurückgegeben werden. Das Ergebnis muss dann über den Rückgabewert der Funktion zurückgegeben werden, was in dem Beispiel aber nicht geschieht.

Das Beispiel funktioniert, wenn "Result" eine globale Variable ist. So kann man es natürlich auch machen - mit dem Nachteil, dass das Hauptprogramm das Ergebnis dann immer aus dieser einen globalen Variable holen muss.

Man wird deshalb die Funktion das Ergebnis zurückgeben lassen. Der Syntax wäre dann:

quadrat := x * x

"quadrat" muss der Name der Funktion sein. So ist die Syntax in Pascal und VBS-Script. In Sprachen wie C und Javascript wird dagegen das Wort "return" verwendet:

return x * x;

Uli C--79.198.227.85 19:44, 5. Jan. 2023 (CET)Beantworten

Die Korrektur von   Result := wert + wert;
nach   quadrat := wert + wert;
habe ich nun eingebaut. --Uli Cl (Diskussion) 00:58, 5. Mai 2024 (CEST)Beantworten

Mathematisch falsch

Bearbeiten

Dieser Teil aus dem Artikel stößt mir auf:

In der Zuweisung a = a + 1 ist zum Beispiel mit dem linken a die Speicheradresse der Variablen a und mit dem rechten a ihr Wert gemeint (Wodurch dieser mathematisch falsche Ausdruck überhaupt erst Sinn ergibt).

Angenommen, a enthalte −1. Wenn ich das, was da steht, so nehme, würde a+1 gerechnet und das Ergebnis (also 0) als Speicheradresse der Variablen benutzt. Weiteres Benutzen von a ist also Hantieren mit Nullpointern?? Weiter folgt, dass das Ganze als mathematisch falscher Ausdruck bezeichnet wird, was ja total verkennt, dass ganz offenbar "=" hier nicht für einen Vergleich oder eine Gleichheitsaussage steht, sondern für eine Zuweisung (steht da ja sogar eingangs). Leider verstehe ich nicht genau, worauf der Mitautor an dieser Stelle hinaus will und belasse es bei meiner Moniererei hier auf der Disk.

-- Pemu (Diskussion) 23:35, 14. Dez. 2023 (CET)Beantworten

Das a auf der linken Seite der Zuweisung bedeutet etwas anderes als das a auf der rechten Seite der Zuweisung. Das linke a ist ein sognannter "L value", was bedeutet: "Eine Variable, welche eine Speicheradresse hat". Das rechte a ist ein "R value", was bedeutet: "Ein Wert (einer Variablen) oder eines Ausrucks (ohne hinterstehender Variablen oder Speicheradresse).
Durch die Zuweisung ändert sich der Wert von a, aber nicht die Adresse von a.
Der Wikipedia-Artikel L-Wert (Programmierung) erklärt es (leider nicht besonders gut), der engl. Artikel en:Value_(computer_science) ist umfangreicher, aber ich finde ihn leider auch nicht wirklich verständlich. Aber ich hoffe, sie helfen dir dennoch weiter. --RokerHRO (Diskussion) 12:55, 18. Dez. 2023 (CET)Beantworten
So gesehen könnte man aber auch sagen, rechts das a ist eine Variable, die eine Speicheradresse hat, in der der derzeitige Wert (der Variablen) steht. Der vom Compiler erzeugte Code zaubert ja den Wert nicht aus dem Hut, sondern liest ihn aus einer (ihrer) Speicherstelle aus. (Mal eventuelle Optimierungen außen vor gelassen, wenn der Compiler in speziellen Fällen erkennt, dass er den Wert doch aus dem Hut zaubern kann.)
Der Unterschied zwischen den beiden Seiten des Zuweisungs-Operators liegt ja darin, ob lesend oder schreibend auf die Variable zugegriffen wird. In beiden Fällen muss die zugehörige Speicheradresse bekannt sein und ggf. zunächst ermittelt werden.
Soweit ich die Sache mit den L- und R-Werten verstanden habe, ist das einfach eine syntaktische Klassifizierung. Dadurch, dass im Beispiel im Ausdruck rechts vom Zuweisungsoperator der Wert von a genommen wird und damit gerechnet wird (eins dazugezählt wird), existiert zwar dieser Wert des Ausdrucks, aber kein dazugehöriger Speicherplatz.
Jetzt ahne ich, worauf Du/die anderen hinauswollen: Wenn man im Detail schaut, nämlich aus der Sicht des Zuweisungsoperators (also was macht der eigentlich), so nimmt dieser einen Wert und eine Adresse entgegen und speichert den Wert unter der Adresse ab. Als Infrastruktur muss er natürlich einen Dienst Ausdruck auswerten inanspruchnehmen, der hier den anderen Teil der Arbeit macht, also Wert von a ermitteln (Adresse ermitteln, Wert auslesen), den Wert von '1' ermitteln (Literal konvertieren; vermutlich wird das schon zur Compile-Zeit abgefrühstückt), Funktionalität des "+"-Operators mit den beiden Werten aufrufen, etc.
Aber es muss auch ein Dienst Adresse eines LValue ermitteln inanspruchgenommen werden, um die Zuweisung mit der Adresse zu versorgen.
Ich finde im Übrigen den Artikel zumindest nicht falsch; ich meine, er ist verständlich, sofern man schon weiß, um was es geht. :-\
-- Pemu (Diskussion) 11:46, 20. Dez. 2023 (CET)Beantworten