Call by Reference - Syntaxfehler?



  • Hallöchen allerseits! 🙂

    ich habe noch Schwierigkeiten bzgl. callbyreference-Funktionen. In meinem Buch steht folgende Beispielaufgabe, die ich soweit auch nachvollziehen kann:

    #include <iostream>
    #include <conio.h>
    using namespace std;
    
    void Dreieckstausch(int *Zeiger1, int *Zeiger2)
    {
         int temp;
         temp=*Zeiger1;
         *Zeiger1=*Zeiger2;
         *Zeiger2=temp;
         return;
    }
    
    int main()
    {
        int zahl1=3,zahl2=8;
        cout<<"--- Vorher:"<<endl
            <<"Zahl1 = "<<zahl1<<endl
            <<"Zahl2 = "<<zahl2<<endl
            <<"- Adresse von Zahl1 = "<<&zahl1<<endl
            <<"- Adresse von Zahl2 = "<<&zahl2<<endl<<endl;
        Dreieckstausch(&zahl1,&zahl2);
        cout<<"--- Nachher:"<<endl
            <<"Zahl1 = "<<zahl1<<endl
            <<"Zahl2 = "<<zahl2<<endl
            <<"- Adresse von Zahl1 = "<<&zahl1<<endl
            <<"- Adresse von Zahl2 = "<<&zahl2<<endl<<endl;
    
        getch();
    }
    

    Ausgabe:
    http://www.abload.de/img/cbrefbpg7.jpg

    nun wollte ich versuchen, es in einem eigenen Programm zu verwirklichen: Strom (i) und Spannung (u) sind gegeben. Errechnet werden sollen Widerstand (r) und Leistung (p) mit folgenden Formeln:
    r=u/i
    und
    p=u*i

    Die Ergebnisse r und p sollen an das Hauptprogramm zurückgegeben und dort ausgegeben werden. Das habe ich folgendermaßen versucht, zu programmieren:

    #include <iostream>
    #include <conio.h>
    using namespace std;
    
    void ohmsches(int *u, int *i){
         int r,p;
         r = *u / *i;
         p = *u * *i;
         return;
    }
    
    int main (){
        int spannung=230, strom=2, widerstand=0, leistung=0;
        cout<<"---Gegeben:"<<endl
            <<"  Spannung = "<<spannung<<endl
            <<"     Strom = "<<strom<<endl<<endl;
    
        ohmsches(&spannung,&strom);
    
        cout<<"---Gesucht:"<<endl
            <<"Widerstand = "<<widerstand<<endl
            <<"  Leistung = "<<leistung;
    
        getch();
    }
    

    Ausgabe:
    http://www.abload.de/img/ohm2u76.jpg

    Allerdings bleiben r und p unverändert. Was mache ich falsch?



  • weil du die 2 variablen die du an die funktion übergibst nicht die sidn die beschreiben werden

    du erzeugst ind er funktion 2 neue ints die du dann mit den werten belegst
    aber wenn die funktion zu ende ist werden diese beiden ints wieder gelöscht



  • Du übergibst ja widerstand und leistung gar nicht an die Funktion. Irgendwie müssen die schon kommunizieren. 😉

    Eine Möglichkeit:

    // Übergabe per:          value        value      reference        reference
    void berechne_groessen(int spannung, int strom, int* widerstand, int* leistung)
    {
        *widerstand = spannung / strom;
        *leistung   = spannung * strom;
    }
    

    Aufruf:

    berechne_groessen(spannung, strom, &widerstand, &leistung);
    


  • Nichtsdestotrotz würde ich eher so etwas machen wie:

    int widerstand(int const &u, int const &i){
         return u / i;
    } 
    
    int leistung(int const &u, int const &i){
         return u * i;
    }
    


  • jencas schrieb:

    Nichtsdestotrotz würde ich eher so etwas machen wie:

    Ja, ich eigentlich auch. Aber das hilft ihm nicht besonders viel, was Call by Reference angeht. 😉

    Ausserdem würde ich skalare Typen nicht als Const-Referenz übergeben, das ist den Aufwand meist nicht wert (Grösse ist etwa gleich wie die der Referenz, aber man erhält den Dereferenzierungsoverhead).



  • Danke Nexus!
    jetzt versteh ich auch das Prinzip. 🙂

    Danke auch an die anderen beiden. Ich wollte allerdings wissen, wie es mit mehreren Funktionswerten funktioniert, deswegen war Nexus' Lösung hilfreicher 😉

    hier noch mal für alle später Suchenden mein fertiges, funktionierendes Programm:

    #include <iostream>
    #include <conio.h>
    using namespace std;
    
    //            value  value    ref    ref
    //              |      |       |      |
    //              V      V       V      V
    void ohmsches(int u, int i, int* r, int* p){   //Funktion
         *r = u / i;
         *p = u * i;
    }
    
    int main (){
        int spannung=230, strom=2, widerstand, leistung;
        cout<<"---Gegeben:"<<endl
            <<"  Spannung = "<<spannung<<" Volt"<<endl
            <<"     Strom =   "<<strom<<" Ampere"<<endl<<endl;
    
    //            value   value      ref      ref
    //              |       |         |        |
    //              V       V         V        V       
        ohmsches(spannung,strom,&widerstand,&leistung);  //Funktionsaufruf
    
        cout<<"---Gesucht:"<<endl
            <<"Widerstand = "<<widerstand<<" Ohm"<<endl
            <<"  Leistung = "<<leistung<<" Watt";
    
        getch();
    }
    

Anmelden zum Antworten