Komische Fehlermeldung nach Funktionsprogrammierung



  • 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
    


  • Ich verwende das Skript "C++ in 21 Tagen" von Jesse Liberty.

    Dachte, dass es für so nen Anfänger wie mich recht nützlich ist.

    Aber ihr belehrt mich des besseren.

    Das andere Skript, das ich habe, ist von einem Fachdozenten, das aber nur C behandelt.



  • silent_max schrieb:

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

    Sicher nicht. Solange es nicht die Unterschiede zwischen C und C++ beibringen möchte, wird es wirklich niemanden geben der das falsch verstanden hat. (Weil er ja auch nichts schreiben könnte, das irgendwo funktioniert.)

    Ein Beispiel?

    void foo(int a)
    {
    }
    
    void bar(int a, int b)
    {
    }
    
    void baz()
    {
    }
    
    int main()
    {
      foo(5); // :+1: 
      bar(24, 765);// :+1: 
      baz();// :+1: 
    }
    


  • silent_max schrieb:

    Das andere Skript, das ich habe, ist von einem Fachdozenten, das aber nur C behandelt.

    AHA! C != C++!

    In C heißt nämlich diese Deklaration

    void foo();
    

    tatsächlich "ich kann so viele Parameter aufnehmen, wie du willst"!
    Das kann man ausnutzen:

    #include <stdio.h>
    
    #define NO_PARAM
    
    void foo();
    
    int main(void) {
        foo(10, 20.22);
    }
    
    #ifdef NO_PARAM
    void foo(void) {
        printf("ohne Parameter\n");
    }
    #else
    void foo(int x, double y) {
        printf("mit int, double (%d, %f)\n", x, y);
    }
    #endif
    

    Aber das ist C und nicht C++!


Anmelden zum Antworten