Funktion mit mehrdimensionalem Array als Rückgabewert



  • Hallo,

    ich habe leider in diesem und in anderen Foren keine befriedigende Antwort dazu gefunden.
    Wie deklariert man eine Funktion die einen mehrdimensionales Array als Rückgabewert hat? Ich habe folgendes versucht:

    double** beispielfunktion(double argument1)
    {
    	double rueckgabewert[2][2] = {{1, 2},{1, 2}};
            return rueckgabewert;
    }
    

    und die Deklaration im *h genau so vorgenommen. Der Fehler lautet: error C2440: 'return': 'double [2][2]' kann nicht in 'double **' konvertiert werden.
    Wenn ich ein eindimensionales array verwende und dann die funktion mit double* deklariere funktioniert alles.

    Deklaration mit double[][] geht auch nicht.

    Anschließend dann gleich noch die Frage, wie man in diesem Fall den Aufruf programmiert? Bei dem eindimensionalen Array geht es mit:

    dobule *ergebnis = beispielfunktion(input);
    

    Hat jemand den Durchblick, warum das nicht funktioniert?
    Vielen Dank im Voraus

    Pierre



  • Du kannst keine Arrays zurückgeben. Wrapper sind das Stichwort.

    Entweder was Vorgefertigtes wie std::tr1::array , oder gleich eine eigene Klasse:

    struct Table
    {
        double Array[2][2];
    };
    

    Kann man natürlich noch beliebig ausbauen (zum Beispiel durch Konstruktoren, Methoden, Templates)...



  • Oder dynamisch an die Sache herangehen...

    double** beispielfunktion(double argument1)
    {
    	// Größe des Arrays festlegen
    	int rows = 2, cols = 2;
    
    	// Speicher allokieren
        double **rueckgabewert = new double *[rows];
        for(int i=0; i < rows; ++i)
    		rueckgabewert[i] = new double[cols];
    
    	// Array mit Werten initialisieren
    	rueckgabewert[0][0] = rueckgabewert[1][0] = 1;
    	rueckgabewert[0][1] = rueckgabewert[1][1] = 2;
    
    	// Und jetzt das Ganze zurückgeben
        return rueckgabewert;
    }
    

    Man darf dann halt nicht vergessen dass man den Speicher hinterher auch wieder freigeben muss.



  • JustSomeCoder schrieb:

    Man darf dann halt nicht vergessen dass man den Speicher hinterher auch wieder freigeben muss.

    Weswegen sich die Funktion eher weniger eignet; besonders, wenn es besser ohne dynamische Speicherverwaltung geht.

    Wenn man die Flexibilität benötigt, zum Beispiel weil die Grösse erst zur Laufzeit bekannt ist, sollten STL-Container wie std::vector Vorrang haben.



  • Mal ne kurze Frage die mich brennend interessiert. Ich programmier noch nicht solange und mache mir schon Gedanken über Dinge die ich bald irgendwann in Angriff nehmen möchte.
    Ich lese hier gerade von zweidimensionalen Arrays oder Vektoren.
    Könnte man mit zB einem zweidimensionalem Array über eine x und y Achse sowas wie eine Matrix in einer Konsole darstellen?
    Ich weiß jetzt nicht ob Matrix der richtige Begriff ist. Was ich meine ist das ich ein zweidimensionales Bild darstellen das ich in der Konsole mit fill() mit X Zeichen fülle. Und dann quasi über eine x und y Achse eine Stelle bestimmen kann in der das X durch ein O ersetzt wird. Ist sowas möglich? Irgendwie wird das sicher gehen, aber wie?
    Würde mich hier auch über Links freuen die das Thema ausführlich erklären.



  • Nexus schrieb:

    Du kannst keine Arrays zurückgeben. Wrapper sind das Stichwort.

    Entweder was Vorgefertigtes wie std::tr1::array , oder gleich eine eigene Klasse:

    struct Table
    {
        double Array[2][2];
    };
    

    Kann man natürlich noch beliebig ausbauen (zum Beispiel durch Konstruktoren, Methoden, Templates)...

    👍
    Hallo,

    vielen Dank für den super Tipp. An structs hab ich in der Situation gar nicht gedacht. Die einfache Art ohne Konstruktoren habe ich implementiert und das funzt auch. Den Rest muss ich mir noch mal anlesen. Sind struct eigendlich auch teil von C oder nur von C++?



  • pierremassello schrieb:

    Sind struct eigendlich auch teil von C oder nur von C++?

    Structs gibt es auch in C.

    Viele Grüße,
    Skalli



  • Skalli schrieb:

    Structs gibt es auch in C.

    Wobei struct in C++ bis auf den Default-Zugriff identisch zu class ist.

    In C konnte man noch keine Memberfunktionen, Vererbung oder Zugriffsspezifizierer einsetzen. struct s waren damals reine Sammlungen von Daten. Zudem musste man bei der Deklaration von Variablen immer angeben, dass es sich um eine Struktur handelt, oder den Weg über typedef struct gehen.


Anmelden zum Antworten