Komische Fehlermeldung nach Funktionsprogrammierung



  • @ 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: 
    }
    


  • cooky451 schrieb:

    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: 
    }
    

    Ich verstehe einfach nicht den Unterschied zwischen den Funktionen, die Parameter erwarten und Funktionen, die keine Parameter erwartet? Wo ist da der Unterschied?



  • silent_max schrieb:

    Ich verstehe einfach nicht den Unterschied zwischen den Funktionen, die Parameter erwarten und Funktionen, die keine Parameter erwartet? Wo ist da der Unterschied?

    Die einen erwarten Parameter und die anderen nicht... ich geb's auf..



  • Bitte schreib je ein Beispiel ... Dann kapier ich es.

    Weil in dem Skript, das ich verwende, wird genau das Gegenteil geschrieben wie Du es mir beibringen willst.



  • silent_max schrieb:

    Weil in dem Skript, das ich verwende, wird genau das Gegenteil geschrieben wie Du es mir beibringen willst.

    Welches Skript ist das? Hört sich ziemlich komisch an. Beispiele hatten wir eigentlich auch genug in diesem Thread...
    Google doch einfach mal nach Funktionsüberladung. Die Parameter (Anzahl undTyp) bestimmen in C++ die Signatur, welche wiederum vom Compiler für die korrekte Zuordnung von Aufrufen verwendet wird.

    #include <iostream>
    using namespace std;
    
    void foo() {
      cout << "ohne Parameter" << endl;
    }
    
    void foo(int x) {
      cout << "mit int (" << x << ") als Parameter" << endl;
    }
    
    void foo(double x) {
      cout << "mit double (" << x << ") als Parameter" << endl;
    }
    
    void foo(int x, double y) {
      cout << "mit int und double (" << x << ", " << y << ") als Parameter" << endl;
    }
    
    int main() {
      foo();
      foo(10);
      foo(12.0);
      foo(10, 20.22);
    }
    
    ohne Parameter
    mit int (10) als Parameter
    mit double (12) als Parameter
    mit int und double (10, 20.22) als Parameter
    

Anmelden zum Antworten