Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Probleme bei Programmierung mit Calll by reference

Empfohlene Antworten

Veröffentlicht

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

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

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

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

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.

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

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>

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.

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

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.

schau dir doch wegen der Wurzelgeschichte mal das hier an: C++ Referenz sqrt

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;

}

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;

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

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.