Struct als Funktionsrückgabewert



  • Hallo,

    Ich habe nach diesem Beispiel:

    http://bytes.com/topic/c/answers/530470-can-functions-return-struct

    eine Funktion gebastelt die ein Struct zurückliefert.

    Allerdings ist es mir peinlicherweise schleierhaft wie ich die einzelnen Elemente nun in der empfangenden Funktion aufrufe:

    http://codepad.org/aaYq1ZC5



  • Du brauchst in C++ kein typedef für deine Struct.
    Davon abgesehen funktioniert dein erste Version.



  • Auch wenn es vorbildlich ist, dass du Code auf codepad postest, ist es bei kleineren Sachen eher hinderlich. Hier kannst du gut ein paar duzend Zeilen posten. Und alles, was in die Hunderter geht wird eh nur selten gelesen. 😉

    Deine Syntax erinnert eher an C, als an C++. Für eine C++ Version schaue hier:

    #include <iostream>
    
    struct foo
    {
      int a;
      int b;
    };
    
    const foo bar ()
    {
      foo f;
      f.a = 2;
      f.b = 5;
    
      return f;
    }
    
    int main ()
    {
      foo g;
      g.a = 3;
    
      std::cout << bar ().a
    }
    

    Das sollte wie erwartet funktionieren.



  • Sowhl mit meiner als auch mit der letzen genannten Methode wird blöderweise mit:

    std::cout << bar ().a
    

    die komplette Funktion bar() aufgerufen. Das führt zu sehr seltsamen Ergebnissen zur Laufzeit, wie man sich sicher denken kann.



  • wäre dir lieber, wenn bar() nur teilweise aufgerufen würde?



  • Nein 🙂

    Ich möchte versuchen es besser zu formulieren:

    Innerhalb einer Funktion wird der Nutzer mehrfach dazu aufgefordert eine Eingabe zu tätigen. Aufgrund der ergebnisse der Eingabe werden unterschiedliche Funktionen aufgerufen. Um die Übersichtlichkeit zu wahren möchte ich die Funktionen jeweils in einem eigenen Block und innerhalb einer headerdatei schreiben. Da nun aber die zweite Funktion 2 oder mehr werte der ersten benötigt, müssen diese Werte zurückgegeben werden:

    struct Foobar
    {
    int a, b, c ;
    };
    
    Foobar Funktion_1
    {
    tuetwas();
    tuenochmehr();
    
    Foobar Nutzerwerte ;
    
    Nutzerwerte.a = 5 ;
    Nutzerwerte.b = 1 ;
    
    return Nutzerwerte ;
    }
    
    void Funktion_2
    {
    cout << Nutzerwerte.a ; // Hier soll nun 5 ausgegeben werden,
    // stattdessen jedoch startet wie erwartet 
    //die Funktion 1 von Anfang an, also auch
    // mit tuetwas() und tuenochmehr(). 
    //Das ist aber unerwünscht, ich benötige lediglich die Nutzerwerte.
    


  • Übergib doch die Struktur als Parmeter ( Referenz ):

    struct Puuh
    {
    	int a,b,c;
    };
    
    void enter_values ( struct Puuh& puh )
    {
    	puh.a = puh.b = puh.c = 1; // Simulierte Benutzereingabe ;)
    }
    
    int main()
    {
    	struct Puuh myPuh = {0};
    	enter_values ( myPuh );
    	cout << myPuh.a << endl;
    
    	return 0;
    }
    

    Gruß,
    B.B.



  • struct Foobar
    {
    int a, b, c ;
    };
    
    Foobar Funktion_1
    {
    tuetwas();
    tuenochmehr();
    
    Foobar Nutzerwerte ;
    
    Nutzerwerte.a = 5 ;
    Nutzerwerte.b = 1 ;
    
    return Nutzerwerte ;
    }
    
    void Funktion_2
    {
    cout << Nutzerwerte.a ; // Hier soll nun 5 ausgegeben werden,
    // stattdessen jedoch startet wie erwartet
    //die Funktion 1 von Anfang an, also auch
    // mit tuetwas() und tuenochmehr().
    //Das ist aber unerwünscht, ich benötige lediglich die Nutzerwerte.
    

    Wie wärs dann damit:

    struct Foobar
    {
    int a, b, c ;
    };
    
    Foobar Funktion_1
    {
    tuetwas();
    tuenochmehr();
    
    return GetNutzerwerte();
    }
    
    Foobar GetNutzerwerte()
    {
       Foobar Nutzerwerte ;
    
       Nutzerwerte.a = 5 ;
       Nutzerwerte.b = 1 ;
    
       return Nutzerwerte ;
    }
    void Funktion_2
    {
    Funktion_1(); //inklusiv tuwas() und tunochmehr()
    GetNutzerwerte(); //Ohne tuwas() und tunochmehr()
    }
    


  • Ich sehe schon, es wird nicht ganz klar wo das Problem liegt.

    Die erste Funktion enthält zum Beispiel die Information dass im Lager 5 Schränke, 2 Betten und 7 Tische stehen.

    Die zweite Funktion gibt eine Übersicht aus:

    Vorhanden sind:
    Schränke (5)
    Betten (2)
    Tische (7)
    

    Diese Informationen muss ihr von der ersten Funktion natürlich übergeben werden.

    Da die erste Funktion aber ausgibt:

    Bitte Anzahl der Schränke eingeben:#
    >> 
    Bitte anzahl der Betten eingeben:#
    >>
    //[...]
    

    macht die zweite Funktion beim Auruf des Rückgabewertes folgendes:

    Bitte Anzahl der Schränke eingeben:#
    >> 
    Bitte anzahl der Betten eingeben:#
    >>
    //[...]
    Es sind vorhanden:
    5 Schränke
    //[...]
    

    Ich dachte nun an eine Art Funktionsvererbung, musste jedoch lesen dass dies nicht möglich ist.



  • serbud schrieb:

    Ich sehe schon, es wird nicht ganz klar wo das Problem liegt.

    Die erste Funktion enthält zum Beispiel die Information dass im Lager 5 Schränke, 2 Betten und 7 Tische stehen.

    Eine Funktion allein kann keine Informationen enthalten, nur verarbeiten (naja, statische Variablen in der Funktion geht schon, aber zugänglich sind die von außen nicht).

    Die zweite Funktion gibt eine Übersicht aus:

    Vorhanden sind:
    Schränke (5)
    Betten (2)
    Tische (7)
    

    Diese Informationen muss ihr von der ersten Funktion natürlich übergeben werden.

    Dann tu das doch! Deine Funktionen sind momentan alle Parameterlos. Gib ihnen einen Parameter vom Typ "Foobar" (am besten ne Referenz).
    Oder noch besser: Löse dich von diesem C-Stil und schreib dir ne Klasse "Lager" die den Lagerbestand speichert. Dann noch Funktionen zum Einlesen und Ausgeben als Memberfunktionen der Klasse, und du postest hier auch endlich im richtigen Forum...


Log in to reply