array zurückgeben



  • hallo erstmal 😃

    ich würde gerne aus einer nebenfunktion einen kompletten 1-D array zurück in die hauptfunktion geben (falls es möglich ist)

    hab mir das so gedacht :p :

    //hauptfunktion
    ...
         int izwischenspeicher[3];
    ...
         izwischenspeicher[] = nebenfunktion();
    
    //nebenfunktion
    ...
    int nebenfunktion()
    {
        int Dummy[3];
        Dummy[0]=12;
        Dummy[1]=11;
        Dummy[2]=13;
    
        return Dummy[];
    }
    

    ich wäre für hilfe sehr dankbar 🙂



  • So gehts nicht. Wenn deine funktion nebenfunktion() zurückkehrt ist Dummy nicht mehr gültig.
    In C wird der Name eines Arrays zu einem pointer auf das erste Element. Du kannst also einen Pointer auf den Typ der Arrayelemente übergeben. Die einzelnen Elemente kannst du in einer Funktion ohne weitere ändern.
    z.B

    void nebenfunktion( int * arr, int size ) {
       int i;
       for ( i= 0; i < size; ++i )
           arr[i]=i*i;
    }
    

    Die funktion rufst du dann so auf

    int zwischenspeicher[3];
         nebenfunktion( zwischenspeicher, sizeof(zwischenspeicher) / sizeof( zwischenspeicher[0] ) );
    

    Eine andere Möglichkeit wäre dass die nebenfunktion() einen Pointer auf ein dynamisch erzeugtes Array zurückgibt.
    z.B

    int * nebenfunktion() {
       int size = 5;
       int i * arr = malloc( sizeof(int));
       for ( i= 0; i < size; ++i )
           arr[i]=i*i;
       return arr;
    }
    

    du verwendest die Funktion dann so

    int * arr = nebenfunktion();
    .... /* arr verwenden */
    free( arr );
    

    Nachteil dieser Methode ist dass du nicht vergessen darfst den in der Funktion reservierten Speicher mit free() wieder freizugeben.
    Kurt

    EDIT: typo entdeckt.



  • Hallo,

    eine weitere Möglichkeit wäre, das Array in einem struct zu kapseln:

    typedef struct {
      int x[3];
    } Foo;
    
    Foo nebenfunktion() {
      Foo f;
      f.x[0] = 1;
      f.x[1] = 2;
      f.x[2] = 3;
      return f;
    };
    
    //...
    
    Foo myFoo = nebenfunktion();
    

    MfG

    GPC



  • @GPC: Das lässt sich compilieren? Da fehlt zumindest noch der Name des verwendeten Elements (also "f*.x*[0]=1;" etc).



  • CStoll schrieb:

    @GPC: Das lässt sich compilieren? Da fehlt zumindest noch der Name des verwendeten Elements (also "f*.x*[0]=1;" etc).

    Ach mist, das hatt ich übersehen, ich werd alt. Das lässt sich so natürlich nicht kompilieren 😃
    Ich geh mal editieren...



  • ZuK schrieb:

    int * nebenfunktion() {
       int size = 5;
       int i * arr = malloc( sizeof(int));
       for ( i= 0; i < size; ++i )
           arr[i]=i*i;
       return arr;
    }
    

    du verwendest die Funktion dann so

    int * arr = nebenfunktion();
    .... /* arr verwenden */
    free( arr );
    

    Wie verhält sich das dann mit dem Pointer arr in der Funktion nebenfunktion? Ist doch eigentlich auch nur eine lokale Variable und somit nach verlassen der Funktion auch weg. Sollte man die nicht eventuell als static deklarieren?



  • Der Pointer arr ist lokal in der Funktion - aber der per malloc() angelegte Speicherbereich liegt auf dem Heap (und seine Adresse steht in arr). Durch das "return arr;" am Ende wird die Adresse des Heap-Speichers dann an den Aufrufer zurückgegeben.

    (und Heap-Speicher bleibt solange gültig, bis er per free() freigegeben wurde)



  • Alles klar - thx 🙂



  • ich habs jetzt 🙂

    vielen dank! 🙂


Anmelden zum Antworten