Wie übergebe ich eine Variable weiter?



  • Guten Abend,

    ich lerne im Moment das Programmieren mit C++.
    Was ich noch nicht verstehe ist, wie übergebe ich eine Variable, die in einer Funktion erstellt bzw. geändert wird, an eine andere Funktion bzw. an die main Funktion?

    //variableEins deklariere ich in der main Funktion und mit & Referenz greife ich darauf zurück.
    //Wenn ich aus der Funktion rauskomme, geht diese Variable verloren.
    //Rufe ich die main Funktion oder eine andere Funktion auf, und rufe variableEins auf, ist diese nicht die, die ich mit der folgenden Funktion versuche zu ändern.

    int aendereDaten( StrukturDaten & variableEins )
    {
          printf("variableEins eingeben:");
          cin >> variableEins;
          printf("Neue variableEins : %i", variableEins );
          return variableEins;
    }
    

  • Mod

    Die Aenderungen werden bereits an den Aufrufer weiter gereicht, dadurch, dass du hier eine Referenz benutzt hast:

    void foo(int i)
    {
      i = 5; // Lokale Kopie des Arguments wird veraendert
    }|
    
    void bar(int &i)
    {
      i = 5; // Es wird wirklich die uebergebene Variable geandert
    }|
    
    int main()
    {
      int zahl = 3;
      foo(zahl);  // zahl ist nach wie vor 3.
      bar(zahl);  // zahl hat nun den Wert 5.
    }
    

    Man kann natuerlich auch mit Rueckgabewerten arbeiten. Referenzen, Funktionen, Rueckgabewerte und so weiter werden in jedem Anfaengerbuch erklaert.

    printf ist eine C-Funktion und nicht typsicher. Du benutzt sie auch prompt falsch, dein Programm wird undefiniertes Verhalten zeigen. Benutz cout fuer Konsolenausgaben. Du wirst hier zwar hoechstwahrscheinlich eine Fehlermeldung bekommen, wenn du cout benutzt (fuer Zeile 4 ebenfalls), aber es ist ja wohl besser, wenn du den Fehler bemerkst, anstatt dass wie bei printf der falsche Code stillschweigend geschluckt wird. Wie es richtig ginge, haengt davon ab, was StrukturDaten genau ist.



  • Heisst Du wirklich wie der Schauspieler?

    Ansonsten schlage ich vor, dass Du *Deinen* Namen benutzt: DEINVornameDEINNachname.
    Schliesslich gibt es keinen Grund, dass Du den Namen fremder Menschen verwendest.

    Oder Du verwendest einen Fantasienamen.

    Danke



  • void foo(int i)
    {
      i = 5; // Lokale Kopie des Arguments wird veraendert
    }|
    
    void bar(int &i)
    {
      i = 5; // Es wird wirklich die uebergebene Variable geandert
    }|
    
    int main()
    {
      int zahl = 3;
      foo(zahl);  // zahl ist nach wie vor 3.
      bar(zahl);  // zahl hat nun den Wert 5.
    }
    

    Danke SeppJ,
    wohin wird bei void bar(int &i) referenziert oder woher kommt der Wert von &i ?
    Beim Parameter einer Funktion referenziere ich doch nur, wenn ich den Wert einer in der Funktion verwendeten Variable von woanders benötige.
    Heißt & etwa auch, dass der Wert sich nicht ändert?

    Und wie sieht es aus, wenn die Funktion nicht void, sondern einen Wert zurückgibt? Wie greife ich auf diesen Wert in der main Funktion zurück?



  • MoritzBleibtreu schrieb:

    Danke SeppJ,
    wohin wird bei void bar(int &i) referenziert oder woher kommt der Wert von &i ?
    Beim Parameter einer Funktion referenziere ich doch nur, wenn ich den Wert einer in der Funktion verwendeten Variable von woanders benötige.

    ... Das ergibt keinen Sinn 😕 (Würfelst du Zeiger und Referenzen zusammen?)

    Beanworte folgendes:

    int a = 2;
    int& i = a;
    i = 3;
    std::cout << a; // was wird a hier für einen Wert haben?
    

    MoritzBleibtreu schrieb:

    Heißt & etwa auch, dass der Wert sich nicht ändert?

    Ganz im Gegenteil! Wenn Wert = der Parameter ist. In Sepps Beispiel hat "zahl" nach dem Aufruf der Funktion den Wert aus der Funktion.

    MoritzBleibtreu schrieb:

    Und wie sieht es aus, wenn die Funktion nicht void, sondern einen Wert zurückgibt? Wie greife ich auf diesen Wert in der main Funktion zurück?

    Die Antwort ist simpel und die normale vorgehensweise mit Funktionen:

    int func() { return 2; }
    int result = func(); // result = 2
    

Anmelden zum Antworten