Ankündigung

Einklappen
Keine Ankündigung bisher.

Kopie und Referenz bei einer funktion.

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Kopie und Referenz bei einer funktion.

    Ich versuch grad dieses Programm zu schreiben aber irgendwie funktioniert die Rückgabe des Produktes nicht.

    Schreiben Sie ein PHP-Programm (Datei p252.php) mit einer Funktion
    rechne(). Dieser Funktion werden zwei Zahlen übergeben. Sie soll zwei
    Ergebnisse über die Parameterliste zurückliefern: zum einen die Summe der
    beiden übergebenen Zahlen, zum anderen das Produkt der beiden übergebenen
    Zahlen.
    Alle beteiligten Zahlen sollen im Hauptteil des Programms, also außerhalb
    der Funktion, ausgegeben werden. Verwenden Sie zur Übergabe die zweite
    Methode (call-by-reference).
    Mein ansatz wäre so:
    PHP-Code:
    <html>
    <head>
    <?php
    function rechne(&$a, &$b)
    {
    $temp $a;
    $a $a $b;
    $b $a $b;
    $temp $b;
    }
    ?>
    </head>
    <body>
    <?php
    $z1 
    2;
    $z2 5;

    echo 
    "Die Summe von $z1 und $z2 ist ";
    rechne($z1$z2);
    echo 
    "$z1<br />";
    ?>
    <?php
    $z3 
    2;
    $z4 5;

    echo 
    "Das Produkt von $z3 und $z4 ist ";
    rechne($z3$z4);
    echo 
    "$z4";
    ?>
    </body>
    </html>
    In meiner 2. PHP Zeile wird nicht das Produkt, zurück an das Orginal weitergegeben und ich krieg als Produkt 35 raus.
    Wo ist mein Fehler?
    Danke im vorraus.

  • #2
    Warum tut deine Funktion zwei verschiedene dinge? Eine Funktion, eine Sache die sie tut!

    PHP-Code:
    function plus($a$b) {
        return 
    $a b;
    }

    function 
    mal($a$b) {
        return 
    $a b;

    Kommentar


    • #3
      Hier solltest du deine Antwort finden.

      EDIT: tkausl war schneller

      Kommentar


      • #4
        Ich muß gestehen, dass ich mir nicht sicher bin, die Aufgabenstellung verstanden zu haben, aber könnte es mir so vorstellen
        PHP-Code:
        function rechne( &$a, &$b ) {

            
        $x $a;
            
        $a += $b;
            
        $b *= $x;

        }

        $a 2;
        $b 5;

        rechne$a$b );
        echo 
        'Summe: ' $a;    // 7
        echo 'Produkt: ' $b;    // 10 
        ...den Sinn kann ich mir noch nicht erklären, aber zur Übung, ok...

        Kommentar


        • #5
          Zitat von tkausl Beitrag anzeigen
          Warum tut deine Funktion zwei verschiedene dinge? Eine Funktion, eine Sache die sie tut!

          PHP-Code:
          function plus($a$b) {
          return 
          $a b;
          }

          function 
          mal($a$b) {
          return 
          $a b;

          Danke für deine Antwort.

          Ich dachte mir das sie zwei Ergebnisse zurückgeben soll. Deswegen dachte ich das so sein könnte. hmm...

          Kommentar


          • #6
            Zitat von Arne Drews Beitrag anzeigen
            Ich muß gestehen, dass ich mir nicht sicher bin, die Aufgabenstellung verstanden zu haben, aber könnte es mir so vorstellen
            PHP-Code:
            function rechne( &$a, &$b ) {

            $x $a;
            $a += $b;
            $b *= $x;

            }

            $a 2;
            $b 5;

            rechne$a$b );
            echo 
            'Summe: ' $a// 7
            echo 'Produkt: ' $b// 10 
            ...den Sinn kann ich mir noch nicht erklären, aber zur Übung, ok...

            So funtioniert es danke dafür aber was ich nicht verstehe ist wieso ich bei der Funktion im Kopf die Vaiable $x anwende? bei mir hier hab ich beispiele mit statt $x die Variable $temp und keine erklärung dazu...

            Kommentar


            • #7
              Du nutzt temp aber nicht. Nach deiner addition wurde $a überschrieben mit der summe, für die multiplikation ist $a also nichtmehr zu gebrauchen, deswegen speicherst du dir $a in $temp, um den ausgangswert zum multiplizieren haben

              Kommentar


              • #8
                Zitat von Arne Drews Beitrag anzeigen
                Ich muß gestehen, dass ich mir nicht sicher bin, die Aufgabenstellung verstanden zu haben, aber könnte es mir so vorstellen
                PHP-Code:
                function rechne( &$a, &$b ) {

                $x $a;
                $a += $b;
                $b *= $x;

                }

                $a 2;
                $b 5;

                rechne$a$b );
                echo 
                'Summe: ' $a// 7
                echo 'Produkt: ' $b// 10 
                ...den Sinn kann ich mir noch nicht erklären, aber zur Übung, ok...
                Und wenn ich die Ausgabe so haben will das ich die Parameter von $a und $b und das ergebniss in eine Zeile schreibe versagen bei mir auch meine Kenntnisse...
                Also als Ausgabe:
                Die Summe von 2 und 5 ist 7
                Das Produkt von 2 und 5 ist 10
                Ich krieg die Orginal Werte nicht in eine Zeil mit dem Ergebniss weil Ja meine Orginal Parameter überschrieben werden.

                Kommentar


                • #9
                  Eine Funktion sollte in der Regel das Ergebnis per return liefern und nicht über die Referenz eines Funktionsparameters. Die Funktion sollte auch nicht wie von Geisterhand Variablen in der Umgebung ändern.

                  Beide Grundsätze werden von dir nicht beachtet, daher deine Probleme. Die Lösung wurde bereits von tkausl gezeigt (#2).
                  Wenn komplexe Funktionen Ergebnisse liefern, die nicht mit einer skalaren Variablen ( integer, float, string , boolean ) dargestellt werden können, können auch Arrays und Objekte per return geliefert werden.

                  Dein Problem liegt aber auch in einer schlechten Aufgabenstellung. Um diese formal zu erfüllen, bestücke deine Funktion mit 2 weiteren Parametern (summe und produkt) welche du für die Ergebnisse benutzt.

                  Kommentar


                  • #10
                    Grundsätzlich soll eine Funktion genau eine Aufgabe verarbeiten und ein Ergebnis per return zurückliefern, wie von tkausl und jspit bereits formuliert wurde.
                    Ich gebe jspit aber auch recht, dass die Aufgabenstellung Mist ist, denn ich lese folgenden Satz so, wie ich den Code dann umgesetzt habe:
                    Sie soll zwei Ergebnisse über die Parameterliste zurückliefern: zum einen die Summe der beiden übergebenen Zahlen, zum anderen das Produkt der beiden übergebenen Zahlen.
                    Das macht absolut keinen Sinn, daher ist die Aufgabenstellung entweder Müll oder falsch verstanden...

                    Um es zu übertreiben, so würde die Ausgabe im ganzen Satz bspw. funktionieren:
                    PHP-Code:
                    function rechne( &$a, &$b ) {

                        
                    $x $a;
                        
                    $a += $b;
                        
                    $b *= $x;

                    }

                    $a 2;
                    $b 5;

                    $aOut = [
                        
                    'summe' => 'Die Summe von ' $a ' und ' $b ' ist ',
                        
                    'produkt' => 'Das Produkt von ' $a ' und ' $b ' ist '
                    ];

                    rechne$a$b );

                    echo 
                    $aOut['summe'] . $a;
                    echo 
                    $aOut['produkt'] . $b
                    Aber sinnvoller wird es dadurch nicht, sondern erfüllt lediglich die Aufgabenstellung!

                    Kommentar


                    • #11
                      Aus der Aufgabenstellung lese ich jedoch nicht raus, das für die Ergebnisse die selben Parameter benutzt werden sollen.
                      Diese Funktion erfüllt daher auch die obige Aufgabenstellung:
                      PHP-Code:
                      function rechne($a,$b, &$summe, &$produkt){
                        
                      $summe $a $b;
                        
                      $produkt $a $b;

                      Kommentar


                      • #12
                        PHP-Code:
                        function rechne($a$b) {
                            
                        $parameterListe = [
                                
                        'summe' => $a $b,
                                
                        'produkt' => $a $b
                            
                        ];

                            return 
                        $parameterListe;

                        Kommentar


                        • #13
                          eben drum - wie hellbringer .. lass deine Funktion ein Array zurückgeben, mit den Rechenergebnissen, dann hast du auch nicht das Problem, dass deinen ursprünglichen Parameter von der Funktion verändert werden und dadurch an anderer Stelle irgendwas merkwürdiges passiert.

                          Kommentar


                          • #14
                            ichbinich bitte PHP/Code-Tags hier im Forum verwenden. Danke!

                            Kommentar


                            • #15
                              Die Überschrift sagt es ja schon. Es soll wohl der Unterschied zu einer Referenzübergabe bei den Parametern in einer Funktion im Gegensatz zu der sonst üblichen Werteübergabe verdeutlicht werden.

                              Hier noch mal das Beispiel von Arne Drews in etwas abgewandelter Form, aus der es eventuell klarer wird.

                              PHP-Code:
                              function rechnereferenz( &$c, &$d )
                              {
                                  
                              $x $c;
                                  
                              $c += $d;
                                  
                              $d *= $x;
                                  return 
                              'irgendwas';
                              }

                              function 
                              rechnewerte$c$d )
                              {
                                  
                              $x $c;
                                  
                              $c += $d;
                                  
                              $d *= $x;
                                  return 
                              'irgendwas';
                              }

                              $a 2;
                              $b 5;

                              var_dump(rechnewerte$a$b ));
                              var_dump($a,$b);
                              var_dump(rechnereferenz$a$b ));
                              var_dump($a,$b);
                              var_dump($x); 
                              Und in der Dokumentation zu Funktionen steht
                              Normalerweise werden den Funktionen Werte als Parameter übermittelt. Wenn man den Wert dieses Parameters innerhalb der Funktion ändert, bleibt der Parameter außerhalb der Funktion unverändert. Wollen Sie aber erreichen, dass die Änderung auch außerhalb der Funktion sichtbar wird, müssen Sie die Parameter als Verweise (Referenzen) übergeben.

                              Kommentar

                              Lädt...
                              X