mehrere Werte bei return



  • hohesC schrieb:

    ...
    oder globalen variablen...
    ... etc.

    Hä? warum nicht gleich gotos(die nicht viel zur lösung des problems beitragen, aber genauso schlimm sind)?

    mephisto21 schrieb:

    Danke für eure Hilfe...ich werde es einfach über globale variablen lösen

    tu es nicht. das is schlechter stil.



  • du machst es dir ja ganz schön einfach 🙄



  • nimm am besten nen struct, da ist der Code aufgeräumt und Du kannst mehrere Werte zurückliefern. Bei globalen Variablen blickt man irgendwann nicht mehr durch ...



  • hohesC schrieb:

    oder globalen variablen...

    Genau, immer weiter so. Wen interessiert schon ein vernünftiger Programmierstil? 🙄

    mephisto21 schrieb:

    Danke für eure Hilfe...ich werde es einfach über globale variablen lösen

    Siehst du, jetzt hast du den Salat.

    Um mephisto21 aber wieder auf den richtigen Weg zu bringen, sag ich's auch nochmal: nimm struct!



  • pointer sind aber auch nicht schlecht, vorallem weil man sich dann die struct und das reinstopfen vor dem call sparen kann.
    muss man aber nicht.



  • mehrere werte gleichzeitig mit einem return-befehl zurückgeben wie in lisp kann man in C nicht. wenn man mehrere werte zurückgeben will, dann wird das in der regel mit zeigerargumenten gemacht, in die die funktion die ergebnisse schreibt.

    hier ein beispiel für eine funktion, die zweit zahlen berechnet und dann zurückgibt;

    void func (int *ap, int *bp)
    {
      int a,b;
    
      /* hier berechnung von a und b einsetzen */
    
      *ap=a; /* a "zurückgeben" */
      *bp=b; /* b "zurückgeben" */
    }
    
    void main ()
    {
      int a,b;
    
      func(&a,&b);
    
      printf(
        "a=%d\n"
        "b=%d\n",
        a,b);
    }
    


  • Konfusius schrieb:

    void func (int *ap, int *bp)
    {
      int a,b;
    
      /* hier berechnung von a und b einsetzen */
    
      *ap=a; /* a "zurückgeben" */
      *bp=b; /* b "zurückgeben" */
    }
    
    void main ()
    {
      int a,b;
    
      func(&a,&b);
    
      printf(
        "a=%d\n"
        "b=%d\n",
        a,b);
    }
    

    Das geht, aber besser ist dieser Weg

    struct mystruct
    {
        // members    
    };
    
    void func (struct mystruct *s)
    {
        // hier members verändern        
    }
    
    int main()
    {
        struct mystruct s;
        // ...
        func (&s);
        // ...
    }
    

    und kommt nicht auf solche ideen

    struct mystruct
    {
        // members    
    };
    
    struct mystruct func (void)
    {
        struct mystruct s;
        // ...
        return s;
    }
    
    int main()
    {
        struct mystruct s = func();
    }
    

    Das funktioniert auch, aber damit macht ihr euch abhängig von einem Feature das sich Return Value Optimization schimpft. Wenn euer Compiler das nicht beherrscht seit ihr am Arsch. Und...vergesst die beschissene pronix Site.



  • ... oder referenzen ...



  • @Anmerkung: Nicht in ANSI C



  • ich finde die 'nicht struct' Lösung besser.
    Denn man muss nicht sinnlose structs erzeugen, wenn man unabhängige Werte hat.

    Sollten die Sachen natürlich zusammen gehören, wäre eine struct möglich. Aber auf Teufel komm raus eine struct zu verwenden ist blödsinn.



  • Shade Of Mine schrieb:

    ich finde die 'nicht struct' Lösung besser.
    Denn man muss nicht sinnlose structs erzeugen, wenn man unabhängige Werte hat.

    Es ist aber schneller, weil nur ein Parameter übergeben werden muß



  • der vorteil geht wieder flöten, weil du vorher die struct füllen musst, wenn du nur für diesen zweck extra eine anlegst.
    wie Shade Of Mine schon sagt..



  • Wenn man 2 Rueckgabewerte hat, kann man auch std::pair verwenden:

    #include <map>
    #include <iostream>
    
    using namespace std;
    
    pair<int, string> f()
    {
     return make_pair(10, "Hallo");
    }
    
    int main()
    {
     pair<int, string> x = f();
     cout << x.first << " " << x.second << endl;
    }
    

    Die Boost-Lib hat genau dazu einen noch praktischeren Datentyp parat ("Tupel" oder so).

    -Gunnar



  • (So, jetzt habe ich mich endlich mal eingeloggt, damit ich zukuenftige unsinnige Beitraege selber loeschen kann. Sorry!)



  • lol



  • c.rackwitz schrieb:

    der vorteil geht wieder flöten, weil du vorher die struct füllen musst, wenn du nur für diesen zweck extra eine anlegst.

    Das mach keinen Unterschied. Die Variablen müssen auch angelegt und befüllt werden. Nur muß man bei einzelnen Variablen pro Variable einen Pointer übergeben. Das ist bei vielen Werten relativ schlecht. Übrigens: Die C++ Lösungen hier sind noch schlechter, weil C++ Objekte einen größeren Overhead mit sich bringen, Konstruktoren aufgerufen werden usw.



  • außerdem sind wir hier in ansi c, da gibts keine aufgeblasene STL 😛


Anmelden zum Antworten