Funktion: 9 floats rein, 3 floats raus



  • Hallo.

    Seid ungefähr 3 Jahren programmiere ich grad das erste mal wieder mit C.
    Ich habe schon das erste Problem und weiß nicht, wie ich es angehen soll.

    Ich möchte eine Funktion schreiben, wo ich 9 floats als Parameter eingebe (das ist kein Problem) und 3 floats wieder ausgebe. Über

    return
    

    kann ich ja eigentlich nur einen Wert ausgeben.

    Könnte mir da bitte jemand mal nen Lösungsvorschlag geben?

    Wäre sehr nett.

    MFG
    ubimal



  • gib ne struktur zurueck, uebergib zeiger, mach die floats global.



  • Hallo

    Man kann immer nur einen Wert zurückgeben. Sonst kann ich mich nur dem Post vor mir anschliessen, wobei ich die Variante mit den Zeigern am Besten finde, ausser die Werte lassen sich gruppieren, dann nimm ein struct.

    chrische



  • Salute,

    chrische5 schrieb:

    wobei ich die Variante mit den Zeigern am Besten finde, ausser die Werte lassen sich gruppieren, dann nimm ein struct.

    die Zeiger-Variante ist meiner Meinung nach die schlechteste, denn d.h. du musst aus der Funktion ein dynamisches Array zurückgeben, welches auch wieder gelöscht werden will. Vergisst man leicht mal. ne Struktur à la:

    typedef struct {
      float a,b,c;
    } Triple;
    

    ist da imho deutlich eleganter.

    MfG

    GPC



  • GPC schrieb:

    Salute,

    chrische5 schrieb:

    wobei ich die Variante mit den Zeigern am Besten finde, ausser die Werte lassen sich gruppieren, dann nimm ein struct.

    die Zeiger-Variante ist meiner Meinung nach die schlechteste, denn d.h. du musst aus der Funktion ein dynamisches Array zurückgeben, welches auch wieder gelöscht werden will.

    Vielleicht stehe ich ja auf dem Schlauch, aber kann er nicht einfach Zeiger auf die floats übergeben, die er ändern will. Warum muss er da dynamische Arrays zurückgeben?

    chrische



  • er meint einen zeiger auf ein dynamisches array zurueckgeben. -hatte ich nicht mit aufgezaehlt.

    ps. ein statisches array wuerde abhilfe schaffen



  • GPC schrieb:

    [...] ne Struktur [...] ist da imho deutlich eleganter [...]

    Ist sie auch. Das nennt sich dann Datenabstraktion.



  • chrische5 schrieb:

    Vielleicht stehe ich ja auf dem Schlauch, aber kann er nicht einfach Zeiger auf die floats übergeben, die er ändern will.

    Ach so, das meintest du:

    void foo(float *a, float *b, float *c  usw. ) { }
    

    Sorry, ich war bei:

    float * foo(float *a, float *b, float *c usw. ) { 
      float *p = malloc(sizeof(float)*3);
      //Array füllen
      return p;
    }
    

    Dein Vorschlag gefällt mir trotzdem noch nicht, ist mir zu unsauber. 😉

    Apollon schrieb:

    GPC schrieb:

    [...] ne Struktur [...] ist da imho deutlich eleganter [...]

    Ist sie auch. Das nennt sich dann Datenabstraktion.

    na denn 😃

    MfG

    GPC



  • also mit den zeigern gehts am besten meiner meinung nach...

    void func(float a, float b, float c, float d, float e, float f, float g, float h, float i, float* ptra, float* ptrb, float* ptrc)
    {
       *ptra = a+b+g;
       *ptrb = c*d-h;
       *ptrc = e-f*i;
    }
    

    und dann so aufrufen

    float a, b, c;
    
    	func(1, 2, 3, 4, 5, 6, 7, 8, 9, &a, &b, &c);
    

    was meint ihr?
    gibts ne bessre lösung???



  • Ich plädiere nach wie vor für die structs:

    typedef struct {
      float a,b,c;
    } Triple;
    
    Triple func(float a, float b, float c, float d, float e, float f, float g, float h, float i) {
      Triple t = {a+b+g, c*d-h, e-f*i};
      return t;
    }
    

    Simple, clean. Was will man mehr?

    MfG

    GPC



  • jeder so wie er will 😃



  • #include <stdio.h>
    
    void func(int *in, int *out)
    {
        out[0] = in[0] + in[1] + in[2];
        out[1] = in[3] + in[4] + in[5];
        out[2] = in[6] + in[7] + in[8];
    }
    
    int main(void)
    {
        int i, data[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9}, res[3];
        func(data, res):
        for(i = 0; i < 3; ++i)
            printf("res[%d] = %d\n", i, res[i]);
        return 0;
    }
    

    falls du denn ohnehin schon arrays verwenden solltest...



  • GPC schrieb:

    Simple, clean. Was will man mehr?

    Das Struct wird bei der Uebergabe kopiert. Zeiger zu uebergeben ist etwas schneller, v.a., wenn in der Funktion nicht sehr viel passiert.



  • tim_g schrieb:

    GPC schrieb:

    Simple, clean. Was will man mehr?

    Das Struct wird bei der Uebergabe kopiert. Zeiger zu uebergeben ist etwas schneller, v.a., wenn in der Funktion nicht sehr viel passiert.

    Mir ging es bei meinem Beispiel hauptsächlich um die Verwendung des Triple structs, nicht um die Art, wie sie zurückgeben wird.

    Ich kann ja immer noch nen Pointer auf die Struktur übergeben/zurückgeben, damit habe ich beide Vorteile, keinen Overhead bei Übergabe und Datenabstraktion.

    MfG

    GPC


Log in to reply