voldemort Geschrieben 25. November 2010 Geschrieben 25. November 2010 hallo, ich habe ein programm geschrieben um die p-q formel zu berechnen und möchte die berechnung in einer funktion ausführen. #include "stdafx.h" #include <iostream> using namespace std; double Qgleich(double *p, double *q, double *x1, double *x2) { *x1=-(*p/2)*(*p**p/4)-*q; *x2=-(*p/2)*(*p**p/4)-*q; return *x1; } int _tmain(int argc, _TCHAR* argv[]) { double p,q; cout <<"Bitte Wert fuer p eingeben\n"; cin >>p; cout <<"Bitte Wert fuer q eingeben\n"; cin >>q; cout <<"Das Ergebnis fuer x1 lautet"<<double Qgleich(double &p, double &q, double &x1, double &x2); cout <<"und das Ergebnis fuer x2 lautet"<<double Qgleich(double &p, double &q, double &x1, double &x2); return 0; } das problem besteht darin das der compiler mit meinem cout's meckert cout <<"Das Ergebnis fuer x1 lautet"<<double Qgleich(double &p, double &q, double &x1, double &x2); cout <<"und das Ergebnis fuer x2 lautet"<<double Qgleich(double &p, double &q, double &x1, double &x2); der fehler lautet: "error C2062: 'double'-Typ unerwartet" und dieser tritt für beide zeilen auf. was habe ich hier falsch gemacht? grüße voldemort Zitieren
carstenj Geschrieben 25. November 2010 Geschrieben 25. November 2010 (bearbeitet) Hi, man ruft so keine Funktion auf. Das Double in dem Aufruf kannste dir sparen, dass weiss der Compiler selber. Außerdem übergibst du Variablen x1 und x2, die nirgendwo deklariert sind. Ein korrekter Aufruf sähe so aus: cout <<"Das Ergebnis fuer x1 lautet"<< Qgleich( &p, &q, &x1, &x2); Wobei natürlich, wie gesagt, x1 und x2 nicht existieren, und der Sinn nach Reference-Übergabe auch noch geklärt werden muss. Es gibt hier nämlich keinen. Bearbeitet 25. November 2010 von carstenj Zitieren
voldemort Geschrieben 26. November 2010 Autor Geschrieben 26. November 2010 ok nun steh ich aber ein bisschen auf dem schlauch. ich möchte doch einmal die variablen p und q holen da ich sie mir der tastaur eingebe und in meine funktion schicken möchte. nach der berechnung möchte ich doch dann x1 und x2 zurück in das mainprogramm holen und da dachte ich das die funktion so aufgerufen wird. ist ein rückgabewert hier eigentlich nötig? ich glaub da brauch ichnoch ein paar tipps um auf die lösung zu kommen. grüße Zitieren
Der_Lampe Geschrieben 26. November 2010 Geschrieben 26. November 2010 Rückgabewert brauchst du keinen wenn du die Variablen so übergibst da du ja nicht mit Wertkopien sondern mit den Variablen selbst in deinem Unterprogramm arbeitest... du brauchst die Variablen x1 und x2 in deinem Hauptprogramm deshalb weil du ja an deine Funktion die Adresse der beiden Variablen übergibst... keine Variablen vorhanden=>Adressen werden nicht übergeben=>Ergebnis wird nirgends gespeichert. also deklariere in deinem Hauptprogramm noch die beiden Variablen x1 und x2 und dann sollte dein Programm funktionieren...les dir falls du das immer noch nicht verstanden hast vllt nochmal Tutorials durch denn die Art der Parametrisierung ist Essentiell in C++. Zitieren
Klotzkopp Geschrieben 26. November 2010 Geschrieben 26. November 2010 ich möchte doch einmal die variablen p und q holen da ich sie mir der tastaur eingebe und in meine funktion schicken möchte.Dazu musst du p und q allerdings nicht by reference übergeben, denn die Funktion soll ja p und q nicht ändern. nach der berechnung möchte ich doch dann x1 und x2 zurück in das mainprogramm holenDu hast die Bezeichner x1 und x2 im Kontext von main aber nicht deklariert. Du brauchst dementsprechende Variablen in main, die die Werte aufnehmen können. ist ein rückgabewert hier eigentlich nötig?Nein. Im Übrigen solltest du hier auch keine Zeiger, sondern Referenzen benutzen. Dein Ansatz sieht nach C aus, da macht man das gezwungenermaßen mit Zeigern, weil es in C keine Referenzen gibt. Zitieren
voldemort Geschrieben 26. November 2010 Autor Geschrieben 26. November 2010 sobald ich nun aber den rückgabewert aus der funktion nehme meckert der compiler 'Qgleich': Muss einen Wert zurückgeben double Qgleich(double *p, double *q, double *x1, double *x2) { *x1=-(*p/2)+(*p**p/4)-*q; *x2=-(*p/2)-(*p**p/4)-*q; } int _tmain(int argc, _TCHAR* argv[]) { double p,q,x1,x2; cout <<"Bitte Wert fuer p eingeben\n"; cin >>p; cout <<"Bitte Wert fuer q eingeben\n"; cin >>q; cout <<"Das Ergebnis fuer x1 lautet"<< Qgleich( &p, &q, &x1, &x2); cout <<"und das Ergebnis fuer x2 lautet"<< Qgleich( &p, &q, &x1, &x2); return 0; } ich haber auch noch das problem das ich noch nicht weiß wie ich die wurzel in die formel eingebe. gibt das nen befehl, funktion oder zeichen? grüße Zitieren
Klotzkopp Geschrieben 26. November 2010 Geschrieben 26. November 2010 sobald ich nun aber den rückgabewert aus der funktion nehme meckert der compiler 'Qgleich': Muss einen Wert zurückgebenDu deklarierst die Funktion immer noch mit dem Rückgabetyp double. Wenn sie nichts zurückgeben soll, brauchst du den Rückgabetyp void. ich haber auch noch das problem das ich noch nicht weiß wie ich die wurzel in die formel eingebe. gibt das nen befehl, funktion oder zeichen?Dafür gibt es die Funktion sqrt, du brauchst dafür #include <cmath> Zitieren
carstenj Geschrieben 26. November 2010 Geschrieben 26. November 2010 Hi, sorry dass ich das so sage, aber so ein klitzekleines Tutorial oder ein Buch würde da schon helfen, weil es die elementaren Grundlagen sind, die dir offenbar fehlen. Natürlich helfen wir dir auch gerne bei konkreten Problemen, nur dürfte das Lernen von Grundlagen weitaus effektiver sein. Zitieren
voldemort Geschrieben 26. November 2010 Autor Geschrieben 26. November 2010 (bearbeitet) Du deklarierst die Funktion immer noch mit dem Rückgabetyp double. Wenn sie nichts zurückgeben soll, brauchst du den Rückgabetyp void. ach mist. total vergessen. da ist es ja klar das der compiler meckert. sorry dass ich das so sage, aber so ein klitzekleines Tutorial oder ein Buch würde da schon helfen, weil es die elementaren Grundlagen sind, die dir offenbar fehlen. Natürlich helfen wir dir auch gerne bei konkreten Problemen, nur dürfte das Lernen von Grundlagen weitaus effektiver sein. ich bin im besitz von drei büchern und ein eigenständiges tutorial unserer klasse welche ich auch alle benutze. so ist es ja nicht. zum thema verständnis:es ist klar wenn man ein neues thema anfängt es am anfang holpert. ausserdem mache ich diese aufgabe freiwillig um zu lernen. ich kanns auch sein lassen und nächste woche in der schule machen und da ist es doch klar das wenn ich mit den büchern nicht weiter komme bei personen nach frage die mehr erfahrung haben. ist nicht böse gemeint, aber ich bin keiner von denen die hier reinkommen und sofort nach einer lösung schreien um mir die arbeit zu ersparen. hab es nun so weit. fehlt nur noch die wurzel geschichte, aber das bekomm ich auch noch hin void Qgleich(double *p, double *q, double *x1, double *x2) { *x1=-(*p/2)+(*p**p/4)-*q; *x2=-(*p/2)-(*p**p/4)-*q; } int _tmain(int argc, _TCHAR* argv[]) { double p,q,x1,x2; cout <<"Bitte Wert fuer p eingeben\n"; cin >>p; cout <<"Bitte Wert fuer q eingeben\n"; cin >>q; Qgleich( &p, &q, &x1, &x2); cout <<"Das Ergebnis fuer x1 lautet "<<x1<<'\n'; cout <<"und das Ergebnis fuer x2 lautet "<<x2<<'\n'; return 0; } grüße Bearbeitet 26. November 2010 von voldemort Zitieren
carstenj Geschrieben 26. November 2010 Geschrieben 26. November 2010 Hi, ist nicht böse gemeint, aber ich bin keiner von denen die hier reinkommen und sofort nach einer lösung schreien um mir die arbeit zu ersparen. ich meinte das auch nicht böse, nur das systematische Durcharbeiten eines Buches und das Fragen nach konkreten Problemen bringt meines Erachtens mehr. Zitieren
Der_Lampe Geschrieben 26. November 2010 Geschrieben 26. November 2010 schau dir doch wegen der Wurzelgeschichte mal das hier an: C++ Referenz sqrt Zitieren
voldemort Geschrieben 26. November 2010 Autor Geschrieben 26. November 2010 wie gesagt arbeite ich mit den büchern. ich würde dir recht geben das buch systematisch durchzugehen, aber ich muss mich auch an den unterrichtsplan orientieren und muss mir meine zeit gut einteilen da ich die weiterbildung auf der abendschule mache und zu hause noch frau und kind habe. wie gesagt. ist es doch klar:wenn man von alleine nicht drauf kommt weil man schon wieder irgend einen denkfehler hat oder einfach total falsch denkt sucht man sich hilfe. rom wurde schließlich auch nicht an einem tag erbaut so und die lösung lautet. #include "stdafx.h" #include <cmath> #include <iostream> using namespace std; void Qgleich(double *p, double *q, double *x1, double *x2) { *x1=-(*p/2)+(sqrt(*p**p/4)-*q); *x2=-(*p/2)-(sqrt(*p**p/4)-*q); } int _tmain(int argc, _TCHAR* argv[]) { double p,q,x1,x2; cout <<"Bitte Wert fuer p eingeben\n"; cin >>p; cout <<"Bitte Wert fuer q eingeben\n"; cin >>q; Qgleich( &p, &q, &x1, &x2); cout <<"\nDas Ergebnis fuer x1 lautet "<<x1<<'\n'; cout <<"und das Ergebnis fuer x2 lautet "<<x2<<'\n'; return 0; } Zitieren
carstenj Geschrieben 26. November 2010 Geschrieben 26. November 2010 Hi, nur sauber ist es trotzdem nicht, weil du wieder Zeiger benutzt, was unnötig ist. In C++ mit Zeigern zu hantieren ist meistens überflüssig. Außerdem musst du Parameter p und q nicht per reference übergeben, das macht keinen Sinn. Unter C++ ist '\n'; eigentlich weniger gebräuchlich, man nimmt stattdessen std:endl; Zitieren
voldemort Geschrieben 26. November 2010 Autor Geschrieben 26. November 2010 ja, richtiges c++ ist es nicht, weil wir eigentlich den umschwung zu c++ im moment machen. da aber aufgefallen ist das wir so gut wie null ahnung von funktionen haben, wiederholt der lehrer dies thema nochmal. da ich mich aber schon mal an ein paar sachen wie cout und cin gewöhnen möchte benutze ich diese mittlerweile. Unter C++ ist '\n'; eigentlich weniger gebräuchlich, man nimmt stattdessen std:endl; werd ich mal ausprobieren grüße Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.