[gelöst] array an Funktion übergeben/bzw array zurückgeben



  • SeppJ schrieb:

    Die erinnerung schrieb:

    Das wars schon 😃 😃 😃

    Mit zahlreichen Fallen die ein Anfänger noch nicht einmal sieht und schlechter Stil ist es auch noch.

    ich hab einfach seinen Code genommen und auf seine "Bdürfnisse" oder seine Problemstellung angepasst. 😉



  • Die erinnerung schrieb:

    SeppJ schrieb:

    Die erinnerung schrieb:

    Das wars schon 😃 😃 😃

    Mit zahlreichen Fallen die ein Anfänger noch nicht einmal sieht und schlechter Stil ist es auch noch.

    ich hab einfach seinen Code genommen und auf seine "Bdürfnisse" oder seine Problemstellung angepasst. 😉

    Woher weisst du was seine Bedürfnisse sind? Wenn er das Problem einach nur lösen wollte, dann würde er dafür wohl am besten Matlab o.ä. nehmen oder das gleich von Hand lösen..

    Und da er das nicht gemacht hat geht es ihm offensichtlich darum etwas zu lernen, was er von dem dir gezeigten Code nicht tut.

    @Lirave
    Wenn du tatsächlich keine anderen Sachen, wie std::vector benutzen darfst, dann würde ich dir empfehlen dafür einfach ein "Result"-Parameter zu machen.

    void transpose(const double* A, double* R, int n)
    {
    //...
    }
    

    A übergibst du dann einfach und veränderst du ja nicht, also const und das Resultat speicherst du in R.



  • ich habe erst einmal das von "Die erinnerung" ausprobiert, da meckert aber mein Compiler.

    Bild

    Hoffe es liegt nicht an Dev c++

    Drakon wenn ich die Funktion so gestalte wie von dir vorgeschlagen,

    void transpose(const double* A, double* R, int n)
    {
    //...
    }
    

    wie kopiere ich dann das Array vorher ?

    double C[n*n] =  {1, 2, 3,
                          4, 5, 6,
                          7, 8, 9 };
    
    double R[n*n];
    for ( int i=0;i<n*n;i++)
        R[i] = C[i];
    
    transpose(C,R,n);
    

    So wie oben ist es mMn zu viel Aufwand. Und sollte ich wiedereinmal ein Array kopieren wollen, müsste ich erneut die drei Zeilen hinschreiben.
    Am liebsten wäre es mir in einer Funktion, wo ich aber wieder bei dem selben Problem bin.



  • Er hat gesagt er will ein array übergeben, und eins zurückerhalten.

    Ach ja, wenn du eine Matrix als Ergebnis zurück haben willst dann musst du double[][] schreiben, als Rückgabetyp. Das gleiche gilt natürlich für den parameter C



  • Die erinnerung schrieb:

    Er hat gesagt er will ein array übergeben, und eins zurückerhalten.

    Du weisst aber schon, dass man Arrays weder als Parameter noch als Rückgabetyp verwenden kann? 🙄



  • Nexus schrieb:

    Du weisst aber schon, dass man Arrays weder als Parameter noch als Rückgabetyp verwenden kann? 🙄

    Also geht es nur mit Pointern so wie Dragon gezeigt hat ?



  • Nein, es wurden ja andere Alternativen wie std::vector genannt. Wenn die Anzahl Elemente zur Kompilierzeit bekannt ist, würde ich std::tr1::array empfehlen (sofern vorhanden).

    Ansonsten kannst du auch ein Array in ein struct packen, dann bekommt es Wertsemantik ( std::tr1::array ist im Prinzip das, mit zusätzlichen netten Features).


  • Mod

    Hier mal ein hoffentlich anfängerverständlicher Ansatz. Naja, nicht vollverständlich, aber zumindest verständlich wie man es benutzt.

    template<unsigned int size> struct matrix
    {
     double data[size*size];
    };
    
    template<unsigned int size> matrix<size> transpose(matrix<size> D)
    {
     // D.data transponieren, dabei size als Größe nehmen. Dann D zurückgeben:
      return D;
    } 
    
    int main()
    {
      matrix<3> C =  {{1, 2, 3,  // Müssen jetzt doppelte Klammern sein
                       4, 5, 6,
                       7, 8, 9} };
     matrix<3> result=transpose(C);
    }
    


  • Die erinnerung schrieb:

    Er hat gesagt er will ein array übergeben, und eins zurückerhalten.

    Und ich sage dass das ohne einen anständigen Wrapper keine gute Idee ist.

    Ach ja, wenn du eine Matrix als Ergebnis zurück haben willst dann musst du double[][] schreiben, als Rückgabetyp. Das gleiche gilt natürlich für den parameter C

    Nein. Schau dir die Grundlagen über Zeiger und Arrays nochmal an. Auch dein obiger Code zeugt davon, dass du das tun solltest.

    @Lirave
    Man kann das ganze in einer Klasse wrappen (wie es z.B boost::array oder std::tr1::array für statisch Arrays oder std::vector für dynamische macht) oder aber man macht es so, wie ich es gezeigt habe. Native Arrays kann man nicht per Wert zurückgeben (es wird nichts von selbst kopiert).



  • Gut, ich dachte, so funktionierts, aber dann halte ich mir hier raus, da ich hier sonst überhaupt keine Ahnung habe.



  • Wir sind leider noch nicht so weit gekommen im Stoff.

    Aber es klappt perfekt mittels

    void transpose(const double* Input, double* Result, int n)
    {
    //...
    }
    

    Denke kann als gelöst geschlossen werden, danke euch vielmals für eure schnelle Hilfe.

    Mfg Lirave


Anmelden zum Antworten