Komische Fehlermeldung nach Funktionsprogrammierung
-
Hallo liebe Gemeinde.
Ich habe folgenden Quellcode geschrieben:
#include <iostream> #include <math.h> using namespace std; float Add(float a, float b) { cout << endl; cout << "Addition!" << endl; cout << "Zwei Zahlen bitte!" << endl; cin >> a >> b; float c = a + b; cout << a << " + " << b << " = " << c << endl; cout << endl; return c; } float Sub(float d, float e) { cout << endl; cout << "Subtraktion!" << endl; cout << "Zwei Zahlen bitte!" << endl; cin >> d >> e; float f = d - e; cout << d << " - " << e << " = " << f << endl; cout << endl; return f; } float Mul(float g, float h) { cout << endl; cout << "Multiplikation!" << endl; cout << "Zwei Zahlen bitte!" << endl; cin >> g >> h; float i = g*h; cout << g << " * " << h << " = " << i << endl; cout << endl; return i; } float Div(float j, float k) { cout << endl; cout << "Division!" << endl; cout << " Zwei Zahlen bitte, jedoch darf der Zähler nicht 0 sein!" << endl; cin >> j >> k; float l = j/k ; cout << j << " / " << k << " = " << l << endl; cout << endl; return l; } float Wurzel(float m) { cout << endl; cout << "Quadratwurzel!" << endl; cout << "Eine Zahl bitte!" << endl; cin >> m; float n = sqrt (m); cout << "Ergebnis ist " << n << endl; cout << endl; return n; } int main() { float a,b,c; float d,e,f; float g,h,i; float j,k,l; float m,n; cout << "Rechenoperationen!" << endl; c=Add(a,b); f=Sub(d,e); i=Mul(g,h); l=Div(j,k); n=Wurzel(m); return 0; }Beim Kompilieren kommt kein Fehler. Wenn ich jedoch auf "Debugginng ohne Starten" klicke, dann kommt die Meldung, dass die Variable b zwar initialisiert aber nicht verwendet wird. Hier ein Link mit Bild:
Der Fehler kann aber nicht sein, da die Variable b doch in der Funktion "Add" verwendet wird, oder liege ich falsch??
Danke für die Antworten im Voraus.
Gruß
Max
-
Welchen Wert haben a und b in Zeile 72?
Im Übrigen steht da, dass b verwendet wird ohne initialisiert zu sein. Lesen sollte man schon können.
-
Die Werte von a und b sollen per Tastatur eingelsen werden können. So wie bei den anderen Funktionen auch.
-
silent_max schrieb:
Die Werte von a und b sollen per Tastatur eingelsen werden können. So wie bei den anderen Funktionen auch.
Wozu übergibst du sie dann als Parameter?
-
Weil es dann in der Funktion wie folgt heißt:
Error: Bezeichner ""a"" ist nicht definiert.
Sollte ich z. B. bei der Funktion Add es so schreiben:
float Add(float x, float y)Oder wie würdest Du es machen??
-
Inzwischen sieht der Quellcode wie folgt aus:
#include <iostream> #include <math.h> using namespace std; float Add(float x, float y) { cout << endl; cout << "Addition!" << endl; cout << "Zwei Zahlen bitte!" << endl; cin >> x >> y; float c = x + y; cout << x << " + " << y << " = " << c << endl; cout << endl; return c; } float Sub(float x, float y) { cout << endl; cout << "Subtraktion!" << endl; cout << "Zwei Zahlen bitte!" << endl; cin >> x >> y; float f = x - y; cout << x << " - " << y << " = " << f << endl; cout << endl; return f; } float Mul(float x, float y) { cout << endl; cout << "Multiplikation!" << endl; cout << "Zwei Zahlen bitte!" << endl; cin >> x >> y; float i = x*y; cout << x << " * " << y << " = " << y << endl; cout << endl; return i; } float Div(float x, float y) { cout << endl; cout << "Division!" << endl; cout << " Zwei Zahlen bitte, jedoch darf der Zähler nicht 0 sein!" << endl; cin >> x >> y; float l = x/y ; cout << x << " / " << y << " = " << l << endl; cout << endl; return l; } float Wurzel(float x) { cout << endl; cout << "Quadratwurzel!" << endl; cout << "Eine Zahl bitte!" << endl; cin >> x; float n = sqrt (x); cout << "Ergebnis ist " << n << endl; cout << endl; return n; } int main() { float a=0,b=0,c=0; float d=0,e=0,f=0; float g=0,h=0,i=0; float j=0,k=0,l=0; float m=0,n=0; cout << "Rechenoperationen!" << endl; c=Add(a,b); f=Sub(d,e); i=Mul(g,h); l=Div(j,k); n=Wurzel(m); return 0; }Und es kommt jedes Mal folgende Meldung:
Run Time Check Failure #3 - The variable 'b' is being used without initialized.
Die Meldung kommt für die Variablen b, e, h, k und m.
Ich komme einfach nicht darauf, was ich falsch gemacht habe.
Was ist mein Fehler? Bitte hilft mir.
-
Warum hast du das jetzt auf float geändert?

Whatever, definiere die Variablen doch ganz einfach in der Funktion?float add() { float a; .. float b; .. return a + b; }Du scheinst mir ziemlich verwirrt zu sein..
-
@ cooky451
Ich habe es wie Du gesagt hast, geändert, aber jetzt kommt folgende Fehlermeldung:
d:\sebastian\desktop\lernen für dvt\visual studio 2010\projects\cpp - programmierung\eigene übung 034 - rechenoperationen\rechenoperationen.cpp(77): error C2660: 'Add': Funktion akzeptiert keine 2 Argumente d:\sebastian\desktop\lernen für dvt\visual studio 2010\projects\cpp - programmierung\eigene übung 034 - rechenoperationen\rechenoperationen.cpp(78): error C2660: 'Sub': Funktion akzeptiert keine 2 Argumente d:\sebastian\desktop\lernen für dvt\visual studio 2010\projects\cpp - programmierung\eigene übung 034 - rechenoperationen\rechenoperationen.cpp(79): error C2660: 'Mul': Funktion akzeptiert keine 2 Argumente d:\sebastian\desktop\lernen für dvt\visual studio 2010\projects\cpp - programmierung\eigene übung 034 - rechenoperationen\rechenoperationen.cpp(80): error C2660: 'Div': Funktion akzeptiert keine 2 Argumente d:\sebastian\desktop\lernen für dvt\visual studio 2010\projects\cpp - programmierung\eigene übung 034 - rechenoperationen\rechenoperationen.cpp(81): error C2660: 'Wurzel': Funktion akzeptiert keine 1 Argumente
-
Du darfst dann doch keine Parameter mehr übergeben. Programmieren ist keine Magie. Mach erst mal eine einfache Funktion und überlege wie das alles zusammenhängt und was es bedeutet eine Variable zu definieren. So hat das keinen Sinn.

-
#include <iostream> #include <math.h> using namespace std; float Add(float a, float b) { cout << endl; cout << "Addition!" << endl; cout << "Zwei Zahlen bitte!" << endl; cin >> a >> b; float c = a + b; cout << a << " + " << b << " = " << c << endl; cout << endl; return c; } float Sub(float d, float e) { cout << endl; cout << "Subtraktion!" << endl; cout << "Zwei Zahlen bitte!" << endl; cin >> d >> e; float f = d - e; cout << d << " - " << e << " = " << f << endl; cout << endl; return f; } float Mul(float g, float h) { cout << endl; cout << "Multiplikation!" << endl; cout << "Zwei Zahlen bitte!" << endl; cin >> g >> h; float i = g*h; cout << g << " * " << h << " = " << i << endl; cout << endl; return i; } float Div(float j, float k) { cout << endl; cout << "Division!" << endl; cout << " Zwei Zahlen bitte, jedoch darf der Zähler nicht 0 sein!" << endl; cin >> j >> k; float l = j/k ; cout << j << " / " << k << " = " << l << endl; cout << endl; return l; } float Wurzel(float m) { cout << endl; cout << "Quadratwurzel!" << endl; cout << "Eine Zahl bitte!" << endl; cin >> m; float n = sqrt (m); cout << "Ergebnis ist " << n << endl; cout << endl; return n; } int main() { float a=0,b=0,c=0; float d=0,e=0,f=0; float g=0,h=0,i=0; float j=0,k=0,l=0; float m=0,n=0; cout << "Rechenoperationen!" << endl; c=Add(a,b); f=Sub(d,e); i=Mul(g,h); l=Div(j,k); n=Wurzel(m); return 0; }Komischerweise jetzt funktioniert es.
Kann mir einer von euch erklären, warum die Variablen a bis n (in der main) initialisiert werden müssen, wenn sie bei den einzelnen Funktionen schon deklariert werden? Das ist das Einzigste, was ich noch nicht kapiert habe.
Danke für die Antworten im Voraus.
Gruß
Max
-
Das ist definitiv nicht das einzige, was du noch nicht verstanden hast. Es ist immer noch völlig sinnlos die Variablen als Parameter zu übergeben. (Und du darfst sie nicht uninitialisiert übergeben, weil man nicht von uninitialisierten Variablen lesen darf, und beim Übergeben wird ihr Wert kopiert, also ausgelesen.)
-
Wie würdest es denn Du umsetzen?
Weil ich habe jetzt aus jedem Funktionskopf die Parameter, die übergeben werden sollen, entnommen. Siehe hier:
#include <iostream> #include <math.h> using namespace std; float Add() { cout << endl; cout << "Addition!" << endl; cout << "Zwei Zahlen bitte!" << endl; float a, b; cin >> a >> b; float c = a + b; cout << a << " + " << b << " = " << c << endl; cout << endl; return c; } float Sub() { cout << endl; cout << "Subtraktion!" << endl; cout << "Zwei Zahlen bitte!" << endl; float d, e; cin >> d >> e; float f = d - e; cout << d << " - " << e << " = " << f << endl; cout << endl; return f; } float Mul() { cout << endl; cout << "Multiplikation!" << endl; cout << "Zwei Zahlen bitte!" << endl; float g, h; cin >> g >> h; float i = g*h; cout << g << " * " << h << " = " << i << endl; cout << endl; return i; } float Div() { cout << endl; cout << "Division!" << endl; cout << " Zwei Zahlen bitte, jedoch darf der Zähler nicht 0 sein!" << endl; cin >> j >> k; float j, k; float l = j/k ; cout << j << " / " << k << " = " << l << endl; cout << endl; return l; } float Wurzel() { cout << endl; cout << "Quadratwurzel!" << endl; cout << "Eine Zahl bitte!" << endl; float m; cin >> m; float n = sqrt (m); cout << "Ergebnis ist " << n << endl; cout << endl; return n; } int main() { float a=0,b=0,c=0; float d=0,e=0,f=0; float g=0,h=0,i=0; float j=0,k=0,l=0; float m=0,n=0; cout << "Rechenoperationen!" << endl; c=Add(a,b); f=Sub(d,e); i=Mul(g,h); l=Div(j,k); n=Wurzel(m); return 0; }Dabei kam folgende Fehlermeldung:
d:\sebastian\desktop\lernen für dvt\visual studio 2010\projects\cpp - programmierung\eigene übung 034 - rechenoperationen\rechenoperationen.cpp(47): error C2065: 'j': nichtdeklarierter Bezeichner d:\sebastian\desktop\lernen für dvt\visual studio 2010\projects\cpp - programmierung\eigene übung 034 - rechenoperationen\rechenoperationen.cpp(47): error C2065: 'k': nichtdeklarierter Bezeichner d:\sebastian\desktop\lernen für dvt\visual studio 2010\projects\cpp - programmierung\eigene übung 034 - rechenoperationen\rechenoperationen.cpp(78): error C2660: 'Add': Funktion akzeptiert keine 2 Argumente d:\sebastian\desktop\lernen für dvt\visual studio 2010\projects\cpp - programmierung\eigene übung 034 - rechenoperationen\rechenoperationen.cpp(79): error C2660: 'Sub': Funktion akzeptiert keine 2 Argumente d:\sebastian\desktop\lernen für dvt\visual studio 2010\projects\cpp - programmierung\eigene übung 034 - rechenoperationen\rechenoperationen.cpp(80): error C2660: 'Mul': Funktion akzeptiert keine 2 Argumente d:\sebastian\desktop\lernen für dvt\visual studio 2010\projects\cpp - programmierung\eigene übung 034 - rechenoperationen\rechenoperationen.cpp(81): error C2660: 'Div': Funktion akzeptiert keine 2 Argumente d:\sebastian\desktop\lernen für dvt\visual studio 2010\projects\cpp - programmierung\eigene übung 034 - rechenoperationen\rechenoperationen.cpp(82): error C2660: 'Wurzel': Funktion akzeptiert keine 1 ArgumenteWenn es darum geht, dass ich noch nicht so viel Erfahrung mit C++ Programmierung habe, dann tut es mir leid, dass ich die ersten Schritte mache, die jeder Programmier einmal getan hat.
Für Vorschläge, Anregungen und dergleichen bin ich offen.
-
In Div() versuchst du mit j und k zu arbeiten bevor du sie definierst, wie soll das denn funktionieren?
Und warum übergibst du Parameter an Funktionen die keine wollen?

Mal überlegt die Compilerfehler auch zu lesen?
-
cooky451 schrieb:
In Div() versuchst du mit j und k zu arbeiten bevor du sie definierst, wie soll das denn funktionieren?
Und warum übergibst du Parameter an Funktionen die keine wollen?

Mal überlegt die Compilerfehler auch zu lesen?
Wie meinst Du das mit "Und warum übergibst Du Parameter an Funktionen die keine wollen"??
Ich verstehe echt nicht, was Du damit meinst?
-
Die Funktion heißt "float Sub()", diese Funktion nimmt keine Parameter entgegen.
Aufrufen tust du sie mit "f=Sub(d,e);" - du übergibst die beiden Parameter d und e. Der Compiler versucht deshalb eine Funktion zu finden "float Sub(float, float)" - die gibt es nicht! Er findet nur "float Sub()", deshalb die Meldung "error C2660: 'Sub': Funktion akzeptiert keine 2 Argumente".
-
Also so wie ich dich verstanden habe, sollte beispielsweise der Quellcode für die Funktion Sub so heißen
float Sub(float, float)
{
cout << endl;
cout << "Subtraktion!" << endl;
cout << "Zwei Zahlen bitte!" << endl;
cin >> d >> e;
float f = d - e;
cout << d << " - " << e << " = " << f << endl;
cout << endl;
return f;
}Bei mir kommt jedoch, wenn ich das mache, unter d und e ein roter Strich darunter mit der Meldung "Error: Der Bezeichner ""d"" ist definiert."
Deswegen habe ich d und e im Funktionskopf gelassen, da es jetzt so funktioniert, wie ich es will.
Hier der Quellcode:
#include <iostream> #include <math.h> using namespace std; float Add(float a, float b) { cout << endl; cout << "Addition!" << endl; cout << "Zwei Zahlen bitte!" << endl; cin >> a >> b; float c = a + b; cout << a << " + " << b << " = " << c << endl; cout << endl; return c; } float Sub(float d, float e) { cout << endl; cout << "Subtraktion!" << endl; cout << "Zwei Zahlen bitte!" << endl; cin >> d >> e; float f = d - e; cout << d << " - " << e << " = " << f << endl; cout << endl; return f; } float Mul(float g, float h) { cout << endl; cout << "Multiplikation!" << endl; cout << "Zwei Zahlen bitte!" << endl; cin >> g >> h; float i = g*h; cout << g << " * " << h << " = " << i << endl; cout << endl; return i; } float Div(float j, float k) { cout << endl; cout << "Division!" << endl; cout << " Zwei Zahlen bitte, jedoch darf der Zähler nicht 0 sein!" << endl; cin >> j >> k; float l = j/k ; cout << j << " / " << k << " = " << l << endl; cout << endl; return l; } float Potenz(float o, float p) { cout << endl; cout << "Potenz!" << endl; cout << "Zwei Zahlen bitte!" << endl; cin >> o >> p; float q=pow(o,p); cout << "Ergebnis ist " << q << endl; return q; } float Wurzel(float ) { cout << endl; cout << "Quadratwurzel!" << endl; cout << "Eine Zahl bitte!" << endl; cin >> m; float n = sqrt (m); cout << "Ergebnis ist " << n << endl; cout << endl; return n; } int main() { float a=0,b=0,c=0; float d=0,e=0,f=0; float g=0,h=0,i=0; float j=0,k=0,l=0; float m=0,n=0; float o=0,p=0,q=0; cout << "Rechenoperationen!" << endl; c = Add(a,b); f = Sub(d,e); i = Mul(g,h); l = Div(j,k); q = Potenz(o,p); n = Wurzel(m); return 0; }Wenn Du noch nicht überzeugt bist, dann zeige mir bitte einen alternativen Code. Wie schon gesagt, ich bin für jeden Ratschlag offen.
Gruß
Max
-
silent_max schrieb:
Wie schon gesagt, ich bin für jeden Ratschlag offen.
Es wurde bereits alles geschrieben. Die Funktionen sollten keine Parameter haben. In main müsstest du eigentlich keine Variable deklarieren, die Funktionen können allesamt auf einen Returnwert verzichten.
int main() { Add(); Sub(); Mul(); Div(); Potenz(); Wurzel(); }Mehr ist nicht nötig.
Mich würde mal interessieren, was DVT ist.
-
silent_max schrieb:
Also so wie ich dich verstanden habe, sollte beispielsweise der Quellcode für die Funktion Sub so heißen
float Sub(float, float) { cout << endl; cout << "Subtraktion!" << endl; cout << "Zwei Zahlen bitte!" << endl; cin >> d >> e; float f = d - e; cout << d << " - " << e << " = " << f << endl; cout << endl; return f; }Nein! Wieso denn immer wieder dahin zurück! Wieso nicht einfach die Funktion aufrufen, die du auch anbietest:
float Sub() // <- Sub() OHNE Parameter! { // Implementierung wie gahabt } int main() { float ergebnis = Sub(); // <- angepasster Aufruf - Sub() erwartet keine Parameter! }
-
So langsam glaube ich das soll ein verfrühter Aprilscherz sein.

-
Hast Du es wie folgt gemeint??
#include <iostream> using namespace std; float Sub() { cout << "\tSubtraktion!" << endl; cout << "Zwei Zahlen bitte!" << endl; float a, b; cin >> a >> b; return (a -b); } int main() { float Ergebnis = Sub(); cout << "Ergebnis der Subtraktion: " << Ergebnis << endl; return 0; }Fass es jetzt bitte nicht falsch auf, aber da muss ich erst nachdenken, wo da ein sinnvoller Unterschied ist...