Rückgabewert nicht wie erwartet



  • Hallo Leute,

    Ich hab mich nach Python jetzt mal an C++ rangetraut. Ist ja doch in einigen Bezügen sehr verschieden. Jetzt hab ich ein Problem mit einem kleinen Programm.
    Wenn man das Programm durchlaufen lässt ändert sich nur der Wert a in der funktion update. Der Wert in int main() bleibt unverändert.

    Bitte um Hilfe!

    #include <time.h>
    #include <iostream>
    
    using namespace std;
    
    float a;
    int xx;
    float m = 1.0;
    
    int update(float a, float m)
    {
        a = a + m;
        cout << "a = " << a << endl;
        return a;
    }
    
    int main()
    {
        while (xx==0)
        {
            sleep(2);
            m = m - 0.1;
            cout << "m = " << m <<endl;
            a = update(a, m);
            cout << "a = " << a << endl;
        }
        return 0;
    }
    


  • #include <ctime> // <time.h> ist veraltet
    #include <iostream> 
    
    using namespace std; 
    
    float a;	  	// böse globale Variable
    int xx;		   // böse globale Variable
    float m = 1.0;	// böse globale Variable
    
    int update(float a, float m)	// Wozu sollen 2 Parameter übegeben werden,
    {							   // wenn die Funktion sowieso globale Variablen verwendet?
    	::a = ::a + ::m;				   // Zugriff auf globale Variable per '::'
    	cout << "a = " << ::a << endl;	 // auch Zugriffsoperator oder Scopeoperator genannt
    	return ::a;		// Wozu ein Rückgabewert bei globalen Variablen?
    }
    
    int main() 
    { 
        while (xx==0) // Endlosschleife
        { 
            //sleep(2); <-- kennt Windows in dieser Schreibweise nicht, und ohne <windows.h> erst recht nicht
            m = m - 0.1; 
            cout << "m = " << m <<endl; 
            a = update(a, m); 
            cout << "a = " << a << endl; 
        } 
        return 0; 
    }
    


  • Abgesehen davon, dass du eine Endlosschleife hast, haben a und xx zufällige Werte... du solltest deine Variablen erstmal initialisieren...
    auch wäre es wohl sinnvoller, deiner Funktion update() als Rückgabetypen auch float zu geben...

    Zu den globalen Variablen undso wurd ja schon alles gesagt...



  • danke für die Antworten und die tips.
    Hab denk ich mal zu lange mit Python gearbeitet.
    Das mit dem sleep rührt daher, das ich unter Linux arbeite. Bei Windows is das Sleep.

    Funktioniert jetzt nachdem ich aus int update -> float update gemacht habe.

    #include <ctime>
    #include <iostream>
    using namespace std;
    
    float update(float a, float m)
    {
        a = a + m;
        cout << "a = " << a << endl;
        return a;
    }
    
    int main()
    {
        int xx;
        float a;
        float m = 1.0;
        while (xx==0)
        {
            sleep(4);
            m = m - 0.1;
            cout << "m = " << m <<endl;
            a = update(a, m);
            cout << "a = " << a << endl;
        }
        return 0;
    }
    


  • Ich hab jetzt wohl das "Glück" dass xx zufällig nicht mit 0 initialisiert wird, somit die Schleife garnicht ausgeführt wird... ich glaube nicht, dass das gewünschtes Verhalten sein kann.
    Genau das Gleiche mit a, das kann auch alles und nichts sein.



  • #include <iostream>
    using namespace std;
    
    float update(float a, float m)
    {
        a = a + m;
        return a;
    }
    
    int main()
    {
        float a = 1.0;
        float m = 0.233;
        while (a < 10)
        {
            sleep(1);
            a = update(a, m);
            cout << "a = " << a << endl;
        }
        return 0;
    }
    

    Da wollte ich hin. 🙂



  • U-Boot schrieb:

    Abgesehen davon, dass du eine Endlosschleife hast, haben a und xx zufällige Werte... du solltest deine Variablen erstmal initialisieren...

    Globale Variablen (zumindest PODs) werden mit 0 initialisiert.



  • Hi,

    wie wär's mit

    ...
    void update(float& a, float m)
    {
        a += m;
    }
    
    int main()
    {
    ...
            update(a, m);
            cout << "a = " << a << endl;
    ...
    

    Das würde ich jedenfalls eher von der genannten Funktion erwarten.

    Gruß,

    Simon2.


Anmelden zum Antworten