C++ Verzweiflung mit Handling von Math.c

Black

Cadet 4th Year
Registriert
Mai 2003
Beiträge
124
Also ich mache gerade meine ersten Gehversuche in Visual C++ - was mich als Physiker/Mathematiker mit C (ja ohne ++) ein wenig zur Verzweiflung bringt...

Und zwar, habe ich nun nur mal um mich mit der Sprache ein wenig bekanntzumachen einfach eine Funktion geschrieben die das minimum und das maximum zwischen zwei Funktionswerten herausfinden soll.
aw = exp(0) * sin(0);
ew = exp(0) * sin(0);
So definiere ich mal meine Startwerte - aber das nimmer er mir schon mal nicht, ich habe die <math.h> included und er meint beim kompilieren:

error C2653: 'Math': Keine Klasse oder Namespace
error C2668: 'exp': Mehrdeutiger Aufruf einer überladenen Funktion
1> C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\math.h(563): kann 'long double exp(long double)' sein
1> C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\math.h(515): oder "float exp(float)"
1> C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\math.h(117): oder "double exp(double)"

aw ist vom Typ long double. In Fortran würde man 0.d0 schreiben statt 0, aber wie ist der richtige Befehl in C++?

Nachdem ich nun schon einen Thread offen habe auch gleich noch eine zweite Frage:


In ergebnis kann ja nur ein Wert drin stehen - wie kann ich einen zweiten übergeben?
 
Das Zahlenformat der '0' ist nicht eindeutig definiert. Dasselbe Spiel wie hier: https://www.computerbase.de/forum/threads/error-c2668-bei-visual-c-und-sqrt-befehl.869705/
Du könntest 0.0 bzw. 0.0d (das ist eine double) oder 0.0f (das ist eine float) schreiben.

Die Mathe-Bibliothek importierst du mit #include <cmath>.

Wenn du mehrere Ergebnisse zurückgeben willst, dann übergebe der Prozedur beliebig viele Zeige auf beliebig viele Variablen. Über die Zeiger können die Variablen in der Prozedur geändert werden und die Änderungen bleiben auch dann bestehen, wenn die Prozedur beendet wird.
 
Zuletzt bearbeitet:
error C2668: 'exp': Mehrdeutiger Aufruf einer überladenen Funktion

Da stört ihn nicht wo du es reinspeichern willst, sondern er weiß nicht zu was er die 0 casten soll, wie genau das Ergebnis also werden soll.
exp( (long double) 0 ) sollte es beheben.

Eine Funktion kann dir nur einen Wert zurückgeben. Du könntest dir also entweder ein Array bauen, und einen Pointer darauf zurückgeben, oder Referenzen übergeben, oder Adressen, wo er die Ergebnisse speichern kann, um darauf später zuzugreifen.

Der andere Fehler ist seltsam.
 
Wenn Du die mehrere Werte zurückgeben willst, dann ist der saubere objektorientierte Ansatz diese in einen Classe oder einen struct zu packen und diese dann zurückzugeben. Aufrufe wie
fkt(long &a, long &b) sind ehr c Style und wenig klassenorientiert.
 
Ein unterschied von C++ zu C ist die Verwendung von Namespaces. Mach dich damit vertraut.

Für dein Testbeispiel solltest du <cmath> "includen" anstatt <Math.h> und schreib in dein quellfile die Zeile:

using namespace std;

Da alle bezeichner in der C++ standart library in diesem namespace existieren.


PS.: Alle anderen Lösungsvorschläge sind irre leitend und verkomplizieren deinen code.
 
Zuletzt bearbeitet:
Also ich bin schon gut weitergekommen. (long double) 0 hat geholfen :)

Mein nächstes Problem ist nun folgendes (habe nun die cmath included)

error C2065: 'M_PI': nichtdeklarierter Bezeichner
Ich finde diese Konstante aber genau so in der cmath (besser gesagt in der in ihr inkludierten math.h. Was mache ich da falsch?

Edit: Ich habe außerdem ein

#define _USE_MATH_DEFINES

Vor dem include Befehl von cmath.
 
Zuletzt bearbeitet:
Aber diese Zeile steht 1:1 auch in der math.h die in der cmath ja inkludiert ist?
 
Aber das _USE_MATH_DEFINES habe ich vor die cmath geschrieben und es hat nicht geholfen. Mit dem DEFINE M_PI = 3.14 ... gehts natürlich... ich würde nur gerne verstehen warum.
 
Die einzige Möglichkeit, die ich sehe, ist, dass du darüber einen Header inkludierst, der seinerseits cmath inkludiert. Schreibe bitte das #define mal in die allererste Zeile.
 
#define _USE_MATH_DEFINES
#include <sstream>
#include <string>
#include <cmath>
geht.
#include <sstream>
#include <string>
#define _USE_MATH_DEFINES
#include <cmath>
geht nicht :) So was doofes :(
Ergänzung ()

So, ich verwende den Thread noch ein wenig weiter:

1.) Wo finde ich ein gutes Tutorial wie ich das mit den Klassen/Strukturen lösen kann? Also wie kann ich mehrere Werte zurückgeben bei einer Funktion.

2.) Ich habe gerade folgendes Problem: Ich habe eine Funktion:

System::Double^ rechnung_max(double schrittweite) {
.
.
maximum wird ein long double zugewiesen
.
.
return maximum; }

Sowie einen Aufruf, selbige auszugeben:

long double^ ergebnis_max = rechnung_max(Double::Parse(schrittweite -> Text));
this -> maxausgabe -> Text = ergebnis_min -> ToString();

Als Ergebnis habe ich immer 0. Selbst wenn ich in der Funktion sowas reinschreibe wie "maximum = 1234.5;"

Ist das Problem das, dass ich einmal long double und einmal double verwendet habe, oder habe ich noch was anderes falsch gemacht? Weil ich übergebe der Funktion ja einen Double (schrittweite) und will als Rückwert einen long double (maximum). Muss die Funktion dann ein Long Double^ davor haben, oder wie sieht der Syntax dann aus?
 
Also du speicherst in ergebnis_max und gibst ergebnis_min aus. Ist das so gewollt?

Tuts? Gute Frage, in jedem normalen Tut wird irgendwann auch strcts und classes behandelt...
Du schreibst eine eigene Klasse, und die gibst du dann zurück, fertig...
Ich würde persönlich ein std::pair<long double,long double> verwenden.
 
Kannst du das klarer beschreiben?

Habe folgendes "versucht" mit einem Tutorial, aber bin dann am Weg liegengeblieben :)

struct rueckgabewerte {
long double ld_rueckgabewert;
};

und

class Ausgabewerte {
public:
rueckgabewerte* Head;
};

und nun weiss ich nicht mehr weiter? Ich habe in dem Tut dann noch gelesen, dass ich Head(NULL); initialisieren sollte, aber weiss nicht wie. Mein Problem ganz genau nun ist, wo baue ich nun in meine Funktion wie das ein, so dass ich es in übergeben kann an meine Form?
 
Du brauchst keine extra Klasse, sondern einfach nur eine struct. Hier mal im Beispiel eine Funktion "f", die 2 Doubles zurückgeben soll:
Code:
struct rueckgabewerte {
	long double rueckgabeA;
	long double rueckgabeB;
};

rueckgabewerte f()
{
	rueckgabewerte x;
	x.rueckgabeA = 5;
	x.rueckgabeB = 3;
	return x;
}
 
Zurück
Oben