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.jpgnun 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*iDie 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.jpgAllerdings 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
widerstandundleistunggar 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(); }