Funktionsprobe



  • Hallo, der Probecout geht nicht, er sagt: use of undeclared identyfier (uz)

    #include <string.h>
    #include <iostream>
    using namespace std;
    #include <sstream>
    #include <string>
    #include <vector>
    #include <cstdio>
    #include <math.h>
    
    int zahl=0; //Zelerzahl
    // zu untersuchende Zahl
    int y; // Probeteiler
    
    void test(); //Deklaration
    
    int test(int b, int uz) // Funktion selber
    {
        uz=(zahl*zahl)-2;
        return uz;
    }
    
    int main(int argc, const char * argv[])
    {
        for (zahl=3;zahl<=14;zahl=zahl+2)
        {
        std::cout<<zahl<<". "<<zahl*zahl <<" QZ\n";
        }
        cout<<test(uz)<<"uz \n"; // Aufruf derr funktion funktioniert nicht
        return 0;
    }
    

    Was tun. uz ist doch deklariert! Wenn ich statt "uz" "b" einsetzte, dasselbe Statement von Ihm.



  • Probier es mal mit ausnüchtern.



  • ich habe mal dies:

    #include <function.h>
    

    eingebunden, aber es half auch nichts.



  • otto56 schrieb:

    use of undeclared identyfier (uz)

    Wie wärs, wenn du die Fehlermeldung mit Copy-Paste hier wortwörtlich einfügst? Das ist sowohl für dich schneller, als auch für uns hilfreicher.

    otto56 schrieb:

    Was tun. uz ist doch deklariert!

    Dann sag mir mal, wo - mit Zeilennummer - du sie deklarierst.



  • Fytch schrieb:

    otto56 schrieb:

    use of undeclared identyfier (uz)

    Wie wärs, wenn du die Fehlermeldung mit Copy-Paste hier wortwörtlich einfügst? Das ist sowohl für dich schneller, als auch für uns hilfreicher.

    Das geht nicht in Xcode, weiss nicht, warum .... Screenshot kann ich hier ins Forum nicht einfügen....

    otto56 schrieb:

    Was tun. uz ist doch deklariert!

    Dann sag mir mal, wo - mit Zeilennummer - du sie deklarierst.[/quote]

    ein Zeile 16, oder?



  • Dort ist uz lediglich ein Funktionsparameter der Funktion test . Außerhalb von test kannst du natürlich nicht auf die Parameter von test zugreifen.



  • Fytch schrieb:

    Dort ist uz lediglich ein Funktionsparameter der Funktion test . Außerhalb von test kannst du natürlich nicht auf die Parameter von test zugreifen.

    und nun? Ich muß doch irgendwie den Rückgabewert herausbekommen...? Dazu ist eine Funktion doch da!



  • otto56 schrieb:

    und nun? Ich muß doch irgendwie den Rückgabewert herausbekommen...? Dazu ist eine Funktion doch da!

    Kriegst du ja wenn du die Funktion aufrufst.

    int f() {
        return 42;
    }
    int a = f(); // a hat nun den Wert 42 
    a = 50 - f(); // a hat nun den Wert 8
    

    Welches Buch benutzt du? Resp. wie lernst du C++?



  • Fytch schrieb:

    Welches Buch benutzt du? Resp. wie lernst du C++?

    C++ Dirk Louis 11

    Ich hab jetzt das:

    void test(); //Deklaration der Funktion
    int test(int b, int uz) // Funktion selber
    {
       uz=(zahl*zahl)-2;
        return uz;
    }
    

    und das:

    int a = test();
    

    nach deinem Tipp und er mokiert es. Auch wenn ich einen Variablennamen in die Klammer schreibe, z.B. uz, von oben, weil es in der Funktion deklariert ist.

    Er sagt:
    Cannot initializ a variable of typ int with an rvalue of type void!

    What does it mean? bzw. what I have to do now?



  • otto56 schrieb:

    und er mokiert es

    Wenn du deine zukünftigen Posts nicht vor dem Absenden durchliest und korrigierst, dann kannst du dir selbst helfen. Auch wenn du weiterhin Compiler-Fehlermeldungen paraphrasierst oder mit "er mokiert es" umschreibst.

    Die Deklaration und Definition müssen in der Signatur übereinstimmen. void test(); und int test(int b, int uz) sind nicht diesselbe Funktion. Und wenn du die Funktion ohnehin sogleich definierst, dann brauchst du sie nicht deklarieren. Definitionen implizieren immer auch eine Deklaration.

    otto56 schrieb:

    int b = test();
    

    test hat zwei Parameter vom Typ int . Diese musst du beim Aufrufen natürlich auch übergeben. Das sähe von der Syntax her wiefolgt aus: int b = test(1, 2);



  • int f(int i) {
        return 42 + i;
    }
    
    int a = f(1); // a hat nun den Wert 43
    


  • Danke, es funktioniertE. Ich wußte nicht, daß void auch ein Datentyp ist, ich dachte, es wäre nur so ein Wort!

    Das mit der 1 im Parameter der Rückgabewertes versteh ich zwar nicht, aber es funktioniert ...

    kannst Du das kurz erklären, warum da der Variablenname uz falsch ist?

    Achtung: es funktioniert nicht ganz:

    Er läuft in Schleife, dann drück ich auf Stop, und dann sagt er: 15. 225 QZ
    Program ended with exit code: 9

    Nehme ich das letzte cout in die For-Schleife rein, sagt er sowas: "3. 9 QZ
    (lldb)" Das kann ich mir alles nicht deuten. Warum bricht er nach der 3. Zahl ab?

    Die Zahl aus der Funktion wird nicht ausgegeben!

    int zahl=0; //Zelerzahl
    // zu untersuchende Zahl
    int y; // Probeteiler
    int b=0;
    
    int test(); //Deklaration der Funktion
    
    int test(int uz) // Funktion selber
    {
       uz=(zahl*zahl)-2;
        return uz;
    }
    
    int main(int argc, const char * argv[])
    {
        for (zahl=3;zahl<=15;zahl=zahl+2)
        {
        std::cout<<zahl<<". "<<zahl*zahl <<" QZ\n";
    
        }
        cout<<test(1)<<" uz \n"; // Aufruf der Funktion funktioniert nicht
        return 0;
    }
    


  • int test(); //Deklaration hat keinen Parameter!
    
    int test(int uz) // In der Definition dann doch?
    {
       uz=(zahl*zahl)-2; // warum uz als Parameter übergeben, wenn der übergebene Wert dann nicht verwendet wird?
        return uz;
    }
    

    Wir Fytch schon geschrieben hat muss die Signatur der Funktion (= Rückgabetyp + Name der Funktion + Parameter) bei Deklaration und Definition übereinstimmen.

    In deinem Fall kannst du auf die separate Deklaration verzichten und das in einem Aufwasch erledigen.

    cout<<test(1)<<" uz \n"; // Aufruf der Funktion funktioniert nicht
    

    Du übergibst der Funktion als Parameter den Wert "1" (uz = 1). In der Funktion verwirfst du dann der übergebenen Wert, in dem du zahl * zahl - 2 rechnest und uz zuweist.

    Merke: Globale Variablen (z.B. zahl) sind Scheiße. Alles was innerhalb der Funktion benötigt wird, solltest du als Parameter übergeben. Versuchen wir mal ein halbwegs sinnvolles Beispiel:

    int quadrieren(int zahl) // Parameter vom Typ int mit dem Namen zahl
    {
        return zahl * zahl; // den Wert des Parameters mit sich selbst multiplizieren und als Ergebnis zurückgeben
    }
    
    int main(int argc, const char * argv[])
    {
        std::cout << quadrieren(5); // der Wert 5 wird als Parameter an die Funktion übergeben
    }
    


  • int test (int uz, int zahl)
    { 
        uz = (zahl*zahl) - 2; 
        return uz; 
    } 
    
    int main() 
    { 
        // variablen deklaration
        int zahl = 0;
        int uz = 1;
    
        ...
    
        // aufruf test
        int funktionrueckgabeuz = test (uz, zahl);
    }
    

    🙄



  • otto56 schrieb:

    Die Zahl aus der Funktion wird nicht ausgegeben!

    cout gibt es in dem kontext auch nicht, versuchs mal mit std::cout . Und selbst dann bekommst du immernoch einen anderen wert als du eigentlich erwartest. Neben grundlagen in c++ fehlen dir offenbar zusaetzlich noch grundlagen der mathematik.

    (zahlzahl)2=(1010)2=1002(zahl * zahl) - 2 = (10 * 10) - 2 = 100 - 2

    Wenn du weniger mit globalen variablen rumhantieren wuerdest, waerst du vielleicht irgendwann mal darauf gekommen das du da was falsch machst.



  • ou hab nicht ganz aufgepasst ...

    // warum uz als Parameter übergeben, wenn der übergebene Wert dann nicht verwendet wird?

    👍

    ich bin jetzt einfach mal davon ausgegangen das die rechnung stimmt und prompt nen fehler übernommen 😃

    dann so:

    int test (int zahl)
    { 
        int uz;
        uz = (zahl*zahl) - 2; 
        return uz; 
    } 
    
    int main() 
    { 
        // variablen deklaration
        int zahl = 0;
    
        ...
    
        // aufruf test
        int funktionrueckgabeuz = test (zahl);
    }
    


  • Cardiac schrieb:

    otto56 schrieb:

    Die Zahl aus der Funktion wird nicht ausgegeben!

    cout gibt es in dem kontext auch nicht, versuchs mal mit std::cout .

    er braucht kein

    std::cout
    

    er hat ein: 🙄

    ...
    #include <iostream> 
    using namespace std;
    ...
    


  • SOZB schrieb:

    er braucht kein

    std::cout
    

    er hat ein: 🙄

    ...
    #include <iostream> 
    using namespace std;
    ...
    

    Ach wirklich...?

    otto56 schrieb:

    Die Zahl aus der Funktion wird nicht ausgegeben!

    int zahl=0; //Zelerzahl
    // zu untersuchende Zahl
    int y; // Probeteiler
    int b=0;
    
    int test(); //Deklaration der Funktion
    
    int test(int uz) // Funktion selber
    {
       uz=(zahl*zahl)-2;
        return uz;
    }
    
    int main(int argc, const char * argv[])
    {
        for (zahl=3;zahl<=15;zahl=zahl+2)
        {
        std::cout<<zahl<<". "<<zahl*zahl <<" QZ\n";
            
        }
        cout<<test(1)<<" uz \n"; // Aufruf der Funktion funktioniert nicht
        return 0;
    }
    


  • Danke Leute hab alles hingekriegt und die Berechnung auch glücklich vollendet, Das mit der Übergabe hab ich erst hingekriegt, nachdem ich Alls gelöscht habe und nochmal eingetippt habe. Plötzlich waren die Breakpoints weg!

    Noch eine abschließende Frage:

    #include <string.h>
    #include <iostream>
    using namespace std;
    #include <sstream>
    #include <string>
    #include <vector>
    #include <cstdio>
    #include <math.h>
    #include <stdbool.h>
    
    int test(); //Deklaration der Funktion
    bool primzahl();
    int nr=1;
    int pzz;
    int unpzz;
    
    int test(int b) // Funktion selber
    {
        return b*b-2;// Hier wird die zu untersuchen Zahl festgelegt
    }
    
    bool primzahl(int x)// Bool Primzahlprüfung
    {
        int z = 1;
        int y;
        do
        {
            z=z+2;
            y = x%z;
        } while ((z < pow(x, 0.5)) && (y != 0));
    
        return (y > 0);
    }
    
    int main(int argc, const char * argv[])
    {
    
        for(int i=3;i<=10001;i=i+2)
        {
    
            std::cout<<endl<<"Nr:"<<nr<<". "<<i<<" QZ: "<<i*i<<"  uZ";
            bool c = primzahl(test(i));
           // cout << "BOOL: " << c;
            cout <<": "<<test(i)<< " ist ";
            switch (c)
            {
                case false: cout << "uNPZ.\n "; unpzz++; break;
                case true: cout << "Prim. \n"; pzz++;
            }
    
            nr++;
    
        }
        cout<<pzz<<" PZ + "<<unpzz<<" uNPZ = "<<pzz+unpzz<<" Ergebnisse\n";
        return 0;
    }
    

    Wenn ich oben (Zeile 20) in der Funktion Test etwas mit /, also Bruch berechne, kriegt die zweite Funktion mit bool Schwierigkeiten.

    Ich hatte da mal hingeschrieben b*b-((b+1)/2)
    Daraufhin funktionierte die PrimZahl-Erkennung nicht mehr.

    Wie kommt das?



  • Du hast saemtliche hinweise bezueglich deines codes ignoriert.
    Dir wurde mehrfach erklaert wie prototypen zu deklarieren sind -> ist dir egal.
    Globale variablen sind schlecht -> deine reaktion: MEHR globale variablen; because f*ck it, why not 👍

    Da es dich ja offenkundig nicht interessiert was irgendjemand zu sagen hat, werde ich mir mal alle weiteren kommentare zu deinem code sparen.

    Noch was:

    otto56 schrieb:

    Ich wußte nicht, daß void auch ein Datentyp ist, ich dachte, es wäre nur so ein Wort!

    Entweder solltest du dein buch noch einmal gruendlich von vorne bis hinten lesen, bevor du weiteren code zusammenschusterst (mehr machst du nicht, verstehen tust du ihn definitiv nicht) oder das buch wegschmeissen und was vernuenftiges lesen, wenn void fuer dich ein "wort" ist...


Log in to reply