Zum Inhalt springen

Probleme bei Programmierung mit Calll by reference


voldemort

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von carstenj
Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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++.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 holen
Du 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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

sobald ich nun aber den rückgabewert aus der funktion nehme meckert der compiler 'Qgleich': Muss einen Wert zurückgeben
Du 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>

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von voldemort
Link zu diesem Kommentar
Auf anderen Seiten teilen

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;

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

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;

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...