Pzbildung durch Funktion



  • #include <iostream>
    using namespace std;
    double y;
    int x;
    
    double pz_test(int param,int y)//Funktion selber
    {
        for (int i = 2; i < x; i++)
        {
            if (y%i == 0)
                break;
            else
                y = i+x;
                cout<<y<<" ist jetzt y";;
        }
        return y;
    }
    
    int main(int argc, const char * argv[])
    {
            for (x=1;x>=1000;x=x+2)
            {
                y=x;
                pz_test(y); //Funktionsaufruf
                cout<<y<<" ist y jetzt";
            }
        return 0;
    }
    

    Ich will das jeweilige x als y in die Funktion pz_test bringen. Es funktioniert nicht! Es ist wieder die Argumenteübergabe, an der es hapert ....Er sagt "no matching funktion to pz_test ... aber er sagt nicht, warum pz_test niccht matcht...


  • Mod

    Sonne55 schrieb:

    Ich will das jeweilige x als y in die Funktion pz_test bringen. Es funktioniert nicht! Es ist wieder die Argumenteübergabe, an der es hapert ....Er sagt "no matching funktion to pz_test ... aber er sagt nicht, warum pz_test niccht matcht...

    Die von dir definierte Funktion pz_test hat zwei Parameter, der von dir aufgerufene Funktion übergibst du einen.

    Ansonsten kann ich keine weiteren Kommentare zu deinem Code abgeben, weil mir ein absolutes Rätsel ist, was du dir dabei gedacht hast. Was vermutlich heißt, dass dein Code selbst nach der Korrektur obigen Fehlers nicht so funktionieren wird, wie du es dir vorgestellt hast. Kann es sein, dass du einfach so lange quasi-zufällig Variablendefinitionen und anderen Code hinzu gefügt hast, bis am Ende nur noch eine Fehlermeldung übrig war?

    Allgemein sind globale Variablen jedoch höchst gefährlich in den Händen von Anfängern und sollten von diesen um jeden Preis vermieden werden, da sie zu absolut unnachvollziehbarem Code (und damit auch unnachvollziehbaren Fehlern) führen. Dein Code scheint ein Vorzeigebeispiel dafür zu sein. Wenn ich keine Ahnung habe, was dein Code macht bzw. machen soll, ist davon auszugehen, dass du das auch nicht wirklich weißt.



  • Okay, ich machs einfacher. Will einfach nur erst einmal einen Funktionsaufruf zum Laufen bringen... jetzt läuft er, okay

    #include <iostream>
    using namespace std;
    int y;
    
    int pz_test(int param)//Funktion selber
    {
        y=param+5;
        return y;
    }
    
    int main(int argc, const char * argv[])
    {
                cout<<"in main"<<"\n";
            for (int x=1;x<=10;x=x+2)
            {
    
                cout<<"in for"<<"\n";
                pz_test(x); //Funktionsaufruf
                cout<<y<<" ist y jetzt in main \n";
            }
        return 0;
    }
    

    Morgen packen wir den PZ Test rein ...


  • Mod

    Der zweite Teil einer for-Schleife ist keine Abbruchbedingung, sondern eine Laufbedingung.

    All diese Dinge sind absolute Grundlagen, es ist kaum nachvollziehbar, wie du for-Schleifen und Funktionen kennen kannst, ohne diese Dinge zu wissen. Wie lernst du C++? Deine Methode bzw. dein Lehrer/Lehrmaterial scheint absolut nichts zu taugen.



  • Wie schon gesagt besser mal die globalen Variablen weglassen:

    #include <iostream>
    using namespace std;
    
    int pz_test(int param)//Funktion selber
    {
      int y = param + 5;
      return y;
    }
    
    int main(int argc, const char * argv[])
    {
      cout << "in main" << "";
      for(int x = 1; x <= 1000; x = x + 2)
      {
        cout << "in for" << "";
        int y = pz_test(x); //Funktionsaufruf
        cout << y << " ist y jetzt";
      }
      return 0;
    }
    

    Dein Code hat nichts ausgegeben weil bei deiner for Schleife die Bedingung falsch war. Du wolltest wohl solange etwas ausgaben wie x kleiner als 1000 ist.



  • Noch als Nachtrag: Die Variable y in der main Funktion hat rein gar nichts mit der Variable y in der pz_test Funktion zu tun. Ich kann die Variable in der main auch z oder was auch immer nennen.



  • sebi707 schrieb:

    Noch als Nachtrag: Die Variable y in der main Funktion hat rein gar nichts mit der Variable y in der pz_test Funktion zu tun. Ich kann die Variable in der main auch z oder was auch immer nennen.

    #include <iostream>
    using namespace std;
    int y;
    
    int pz_test(int param)//Funktion selber
    {
        y=param+5;
        return y;
    }
    
    int main(int argc, const char * argv[])
    {
            for (int x=1;x<=10;x=x+2)
            {
                cout<<x<<" ist x"<<"\n";
                pz_test(x); //Funktionsaufruf
                cout<<y<<" ist y jetzt \n";
            }
        return 0;
    }
    

    Ich habs nochmal vereinfacht! Also die globale Variable y sei schlechter Stil, weil sie suggeriert, daß das y von return in Funktion, dieselbe Variable sei, wie das y im Main-cout. Dabei passiert in Wirklichkeit nur ein Kopieren innerhalb der verschiedenen Variablen.

    Warum funktioniert es dann aber nicht, wenn ich das Main-cout verzette und oben ein int z hinschreibe?



  • Was funktioniert denn nicht? Compilerfehler? Laufzeitfehler? Dir gefällt das Ergebnis nicht? Solltest du immer mit aufschreiben, wenn irgendwas 'nicht funktioniert'.
    Ich versteh immer noch nicht warum du eine globale Variable y hast und warum du nicht einfach den Rückgabewert der Funktion benutzt.



  • roflo schrieb:

    Ich versteh immer noch nicht warum du eine globale Variable y hast und

    weil es dann nicht funktioniert, wennn ich die Initialisierung in die Funktion reinnnehme, dann sagte er nämlich zum Main-y "unknow ...."

    roflo schrieb:

    warum du nicht einfach den Rückgabewert der Funktion benutzt.

    Mach mal Beispiel was, Du meinst. Bei mir ist doch der Rückgabewert y, weil er hinter return in der funkt steht. Also nutze ich ihn...

    kukk mal, was passiert ... 2 x unknown Identifyer

    #include <iostream>
    using namespace std;
    
    int pz_test(int param, int y)//Funktion selber
    {
        y=param+5;
        return y;
    }
    
    int main(int argc, const char * argv[])
    {
            for (int x=1;x<=10;x=x+2)
            {
                cout<<"x ist "<<x<<" so "<<"\n";
                pz_test(x, y); //Funktionsaufruf
                cout<<y<<" ist y jetzt \n";
            }
        return 0;
    }
    


  • Sonne55 schrieb:

    Also nutze ich ihn...

    Du nutzt ihn dort, wo die Funktion aufgerufen wird, nicht.

    Da müsste

    int foo = pz_test(x);
    

    oder so stehen. Dann steht der Rückgabewert in foo, und du kannst damit weiter arbeiten.

    Da du das nicht tust, funktioniert es nur mit der globalen Variablen.



  • Ist es so okay?

    #include <iostream>
    using namespace std;
    
    int pz_test(int param1)//Funktion selber
    {
     int Ergebnis=param1+5;
        return Ergebnis;
    }
    
    int main(int argc, const char * argv[])
    {
            for (int x=1;x<=10;x=x+2)
            {
                cout<<"x ist "<<x<<" so "<<"\n";
                cout<<"Funktionsergebnis ist"<<pz_test(x)<<" \n"; //Funktionsaufruf
            }
        return 0;
    }
    

    Was ich nicht versteh, wie das Ergebnis von Funktion in das x vom Funktionsaufruf kommt, obwohl keine Zuweisung stattgefunden hat. Ich dachte, das x ist der Wert, den Main in die Funktion liefert, dabei scheint es den Wert zu präsentieren, der von der Funktion nach Main zurückkommt....



  • Wie kommst du darauf? x wir von der Funktion nicht geändert.



  • Der Code ist in Ordnung, deine Erklärung aber nicht so ganz. Vielleicht fügst du dir nochmal eine Ausgabe von x nach dem Funktionsaufruf hinzu:

    for (int x=1;x<=10;x=x+2)
    {
        cout<<"x ist "<<x<<" so "<<"\n";
        cout<<"Funktionsergebnis ist"<<pz_test(x)<<" \n"; //Funktionsaufruf
        cout<<"x ist "<<x<<" so "<<"\n"
    }
    

    Du wirst feststellen, dass sich der Wert von x nach dem Funktionsaufruf gar nicht geändert hat. Ist ja auch kein Wunder denn du hast wie du selbst schreibst keine Zuweisung. In der Zeile mit dem Funktionsaufruf wird die Funktion mit x aufgerufen und gibt dann irgendein Ergebnis zurück, welches du direkt ausgibst.


Anmelden zum Antworten