Komische Fehlermeldung nach Funktionsprogrammierung



  • 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 Argumente
    

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



  • silent_max schrieb:

    Fass es jetzt bitte nicht falsch auf, aber da muss ich erst nachdenken, wo da ein sinnvoller Unterschied ist...

    Welcher Unterschied? Das "Sub(x,y)" vs "Sub()", oder warum deine Implementierung von "Sub(float, float)" nur "Sub"optimal ist, und wie sie sich von der mit lokalen Parametern unterscheidet?



  • @cooky451: Das ist kein verfrühter Aprilscherz, ganz und gar nicht.

    Ich bin halt noch nicht so fit wie ihr in C++ Programmierung. Bloß ich möchte es lernen.

    Ich möchte euch nicht um Gnade erbitten, aber bitte denkt daran, jeder fängt einmal klein an.



  • Also ja, jeder fängt mal klein an, aber das ist schon extrem. Wenn du eine Funktion foo hast, und diese Funktion keine Parameter erwartet, kannst du sie doch nicht mit Parametern aufrufen. Was daran kann man bitte nicht verstehen?

    void foo()
    {
    }
    
    int main()
    {
      foo(5); // :-1: 
      foo(5, 6, 7); // :-1: 
      foo(); // :+1: 
    }
    

Anmelden zum Antworten