Werte zurückgeben



  • Hallo Zusammen.
    Danke nochmal für die Hinweise aus dem letzten Thema.
    Obwohl euch meine Fragen sicherlich langweilen, wäre ich trotzdem über weitere Hinweise erfreut. Es geht um die Rückgabe von Werten aus einer Funktion. In dem Lernprogramm SoloLearn ist dieses leider nicht detailliert erklärt. Bzw. finde ich im Netz keine Hinweise.

    Warum gibt mir in diesem Programm die Ausgabe nur Nullen an?
    Und warum muss ich z als konstant angeben? Wenn ich nur int z = 10 schreibe, bekomme ich eine Fehlermeldung. Ich verändere z doch nie!?

    const int z = 10;
    
    int Tabelle[z];
    
    void Liste(){
    
        for(int i =0; i < z; i++){
    
             Tabelle[i] = i;  
        }
    }
    
    int main(){
    
        for(int j =0; j < z; j++){
            cout << Tabelle[j];   
        }  
    }
    

    Ich verstehe auch den Unterschied zwischen

    void funktion(){int x = 1}
    

    und

    int funktion() {return int x = 1}
    

    nicht. Gibt das void nicht immer die Werte aus "funktion()" zurück?

    Im Grunde möchte ich nur Werte in einer Funktion bearbeiten und zurückgeben, um diese dann einfach in main() abzurufen....ist das überhaupt möglich?

    Was ich aber nicht möchte, ist die Werte in der Funktion printen und im main() einfach die Funktion aufrufen.

    Ich bedanke mich wieder für jegliche Tipps. 🙂



  • Queiser schrieb:

    Warum gibt mir in diesem Programm die Ausgabe nur Nullen an?

    Wo setzt du denn die Wertde?

    Queiser schrieb:

    Und warum muss ich z als konstant angeben?

    Weil die Sprache so definiert ist.

    Queiser schrieb:

    Gibt das void nicht immer die Werte aus "funktion()" zurück?

    Nein. Schlage mal die Bedeutung von void in einem Wörterbuch nach.

    Queiser schrieb:

    Im Grunde möchte ich nur Werte in einer Funktion bearbeiten und zurückgeben, um diese dann einfach in main() abzurufen....ist das überhaupt möglich?

    Ja

    Wenn das in diesem SoloLearn nicht erklärt wird, solltest du dir etwas anders suchen (z.B. ein C++ Buch).



  • Du rufst die Funktion ja auch gar nicht auf:

    int main(){
    
        Liste();
    
        for(int j =0; j < z; j++){
            cout << Tabelle[j];  
        }  
    }
    

    Und z muß konstant sein, weil Arrays nur mit einer Konstanten erzeugt werden können (d.h. die Größe muß schon zur Kompilierzeit feststehen und nicht erst zur Laufzeit).



  • Ich meine, dass ich die Werte mit

    Tabelle[i] = i;

    setze.

    Void bedeutet leeren, ob sich dies nun darauf bezieht, ob die Werte der Funktion entleert werden und damit ausgegeben oder einfach nur gelöscht, sagt das Wörterbuch leider nicht. Da verlange ich von meinem Ponts-Wörterbuch wohl zu viel.

    ...ja, ich werd mal in die Bibliothek trampeln, und mich nach besserer Lektüre umzusehen.....trotzdem danke.



  • Queiser schrieb:

    Ich meine, dass ich die Werte mit

    Tabelle[i] = i;

    setze.

    Wann wird das ausgeführt? Siehe auch den Beitrag von Th69.

    Queiser schrieb:

    Void bedeutet leeren,

    oder "das Nichts" oder "leer".



  • @Th69
    Bis eben war ich ja auch noch der Meinung, dass void die Werte einfach aus der Funktion zurückgibt und ich diese einfach später aufrufen kann.



  • @Manni66

    Bei einem anderen Programm, das ich wegen der Tipps aus dem letzten Thema erst schreiben konnte, wurden diese Werte ja auch gesetzt.

    int main()
    {
        random_device seeder;
        mt19937_64 engine{seeder()};
        uniform_real_distribution<double> dist{-10.0, 10.0};        
    
        int z = 100;
        double pi = 3.1415;
    
        //----------------------------------------------
    
        double Liste[z][2];
    
        for(int i = 0; i < z; ++i){                                 
                for(int j = 0; j < 2; ++j){                                                                  
                        Liste[i][j] = dist(engine);     
                }  
        }       
    
        cout << "\n" << "x- und y-Poistion: " << "\n" << "\n";
    
        for(int i = 0; i < z; ++i){
            cout << i+1 << " :  ";
            for(int j = 0; j < 2; ++j){
    
            cout << Liste[i][j] <<  "    "; 
            }
            cout << "\n";
        }
    }
    

    In Zeile 16 Wird doch auch jeder Wert des arrays Liste[i][j] gesetzt.
    Der Unterschied hier ist doch nur, dass ich die Werte nicht zurückgeben muss, da diese in keiner Extrafunktion stehen. Oder sehe ich das falsch?



  • Queiser schrieb:

    Der Unterschied hier ist doch nur, dass ich die Werte nicht zurückgeben muss, da diese in keiner Extrafunktion stehen. Oder sehe ich das falsch?

    Der Unterschied ist, dass die Anweisungen hier nicht in einer Funktion stehen und daher ausgeführt werden. Wenn sie in einer Funktion stehen und die Funktion nicht aufgerufen wird, werden sie nicht ausgeführt. Und wenn dir das nach diesem tollen Kurs nicht klar ist solltest du dich mit dem Buch tatsächlich beeilen.



  • Queiser schrieb:

    Bis eben war ich ja auch noch der Meinung, dass void die Werte einfach aus der Funktion zurückgibt und ich diese einfach später aufrufen kann.

    Mit solchen Statements schlägst du hier jedem direkt ins Gesicht. Das sind grundlegendste Sachen, mit minimalstem Aufwand tausendfach im Internet zu finden. Du zeigst NULL Eigeninitiative und bemühst dich kein bisschen. Es wundert mich, dass dir nach dieser Aussage überhaupt noch jemand hier antwortet.



  • void als Rückgabetyp bedeutet, dass es ein kein Rückgabewert gibt.

    In C (daher kommt der Syntax) gibt es nur Funktionen. Und die haben einen Rückgabewert.
    Wenn kein Typ angegeben wird, dann geht C vom Typ int aus.
    Wenn man keinen Wert zurückgeben will, muss man das angeben.
    Hier also mit dem Schlüsselwort void .

    In anderen Sprachen gibt es noch Prozeduren, die haben keinen Rückgabewert.
    Bei manchen Sprachen kommen dafür extra Schlüsselwörter wie PROC oder FUNC noch dazu.
    Aber das ist für einen C-Programmierer schon zuviel Gesabbel.

    ~The darkness would hit me .. And a void would be calling...~



  • ...



  • Queiser schrieb:

    In Zeile 16 Wird doch auch jeder Wert des arrays Liste[i][j] gesetzt.
    Der Unterschied hier ist doch nur, dass ich die Werte nicht zurückgeben muss, da diese in keiner Extrafunktion stehen. Oder sehe ich das falsch?

    Ja, das Array wird in Zeile 16 befüllt. Bei dem Beispiel, bist du ja bereits in der Funktion, die das Array braucht (main hier).

    Beim anderen Beispiel hast du das Array-Befüllen in eine Funktion ausgelagert, die nichts zurückgibt (void). Die Funktion muss auch nichts zurückgeben, weil du dein Array global gemacht hast (schlecht). Aber auch wenn du das Array lokal in die main-Funktion machst (gut), und es dann Liste übergibst, muss Liste keine Werte zurückgeben, weil du der Funktion einen Zeiger übergibst und du damit mit dem Original-Array arbeitest (Liste gibt dann sozusagen indirekt etwas zurück).

    Übrigens will der Compiler beim kompilieren wissen, wie groß ein Array ist... nur const gibt ihm eine eindeutige Antwort.



  • Queiser schrieb:

    NULL Eigeninitiative bedeutet bei mir, dass ich euch drum bitte, mir alles über c++ ausführlich zu erklären, ohne mich vorher über irgendwas informiert zu haben.

    Du hast dich über gar nichts informiert. Hättest du das, wüsstest du wenigstens dass void-Funktionen keinen Rückgabetyp liefert.

    Queiser schrieb:

    Vermeide ich erst durch das Hinterfragen eines komplexen Sachverhaltes den Leuten symbolisch nicht ins Gesicht zu schlagen?

    Komplexer Sachverhalt?! - Du wusstest noch nicht mal dass man Funktionen aufrufen muss, geschweige denn was Funktionen überhaupt sind...


Log in to reply