2D-Array(auf Heap) an Funktion übergeben?



  • Hallo zusammen ...

    Ich glaub ich stell mich wieder mal ziemlich doof an 😃
    Es soll Array[X][Y], welches auf dem Heap liegt an deine Funktion übergeben werden.

    void Funktion(int *Vektor)
    


    Übergeben habe ich den Vektor dann einfach mit

    Funktion(Vektor);
    

    Aber anscheinend lässt sich das nicht wirklich 1:1 auf 2D-Arrays übertragen!
    Schreibe ich

    void Funktion2(int **Matrix)
    

    und versuche über

    Funktion2(Matrix);
    

    Bekomme ich die Fehlermeldung "error C2664: 'Funktion2': Konvertierung des Parameters 3 von 'int (*)[480]' in 'int ** ' nicht möglich
    Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat."

    Was mach ich falsch?



  • Auch ein 2D-Array ist eigentlich nur ein 1D Array. Der Compiler übernimmt für dich die Umrechung. Wenn du aber eines an eine Funktion übergeben willst, und die Dimensionen nicht schon angibst, musst du sie auch von Hand übergeben.

    Siehe hier für genaueres Vorgehen:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-212469-and-highlight-is-array+2+dimensionales.html



  • void func(int (*t)[5]) { }
    void func2(int x[2][5]) { }
    void func3(int x[][5]) { }
    
    ...
    int x[2][5];
    func(x);
    func2(x);
    func3(x);
    

  • Administrator

    #include <iostream>
    
    template<typename T, std::size_t X, std::size_t Y>
    void foo(T(& array)[X][Y])
    {
    	// Testanzeige, ob alles klappt.
    	std::cout << "X: " << X << "\tY: " << Y << std::endl;
    }
    
    int main()
    {
    	int a[10][20];
    	foo(a);
    
    	return 0;
    }
    

    So geht das :p

    Oder jetzt nur mit int und nicht beliebige Typen, dann muss foo so aussehen:

    template<std::size_t X, std::size_t Y>
    void foo(int(& array)[X][Y])
    {
    	// Testanzeige, ob alles klappt.
    	std::cout << "X: " << X << "\tY: " << Y << std::endl;
    }
    

    Es wird hier im übrigen eine Referenz übergeben, also keine Kopie 😉

    Grüssli

    PS: Falls Templates noch nicht bekannt sind, lieber auf die Alternativen ausweichen 😉



  • Vielen Dank für euere Hilfe!
    Ich werde die verschiedenen Methoden gleich mal durchprobieren.
    Wobei ich sagen muss, dass Draveres Variante für mich ein wenig mysteriös aussieht 😕



  • Dravere schrieb:

    So geht das :p

    Aber auch nur so lange, wie die Dimensionen zur Kompilierzeit bekannt sind. 😉

    Es wird hier im übrigen eine Referenz übergeben, also keine Kopie

    Das wird ein Array immer. Oder war das nur eine Klarstellung?


  • Administrator

    drakon schrieb:

    Aber auch nur so lange, wie die Dimensionen zur Kompilierzeit bekannt sind. 😉

    Jap, und er hat was von Heap gesagt, also geht es wohl nicht 😕
    Meine Gedanken sind in den Ferien oder ich habe mich von this->that Beispiel ablenken lassen...

    drakon schrieb:

    Das wird ein Array immer. Oder war das nur eine Klarstellung?

    Klarstellung.
    Wie Mandel gesagt hat, ist die Sache etwas mysteriös, da sollte man das schon nochmals klarstellen 😉

    Grüssli



  • Man kann sich auch eine Klasse basteln. Wenn die Dimensionen nicht immer gleich sind, halt ein Template. Da geht das Kopieren und Referenz-Übergeben etwas einfacher. 😉

    Oder man benutzt gleich Container.



  • Ok... Also Klassen kenne ich, aber bei Templates sagen mir (noch) nichts. Und auch Container ist nen neues Wort für mich in dem Zusammenhang 😃
    Aber ich bin ja auch noch recht neu bei C++ 🙄



  • Container sind fertige Klassen (also genauer gesagt Klassentemplates), die einem ermöglichen, mehrere Elemente gleichen Typs komfortabel zu speichern und zu verwalten. Das populärste Beispiel für Container ist die STL der C++-Standardbibliothek.

    Wenn du mal Zeit hast, lohnt es sich auf jeden Fall, sich damit auseinanderzusetzen. Als Einstieg könntest du beispielsweise die Artikel dieses Forums anschauen.



  • Mandel schrieb:

    Ok... Also Klassen kenne ich, aber bei Templates sagen mir (noch) nichts. Und auch Container ist nen neues Wort für mich in dem Zusammenhang 😃
    Aber ich bin ja auch noch recht neu bei C++ 🙄

    Nur als kleinen Vorgriff: std::vector und std::tr1::array wären mögliche Kandidaten (Gibt aber noch einige mehr die je nach Fall besser geeignet sein können). Ersteres bei dynamischer Größe, letzteres (falls dein Compiler den TR1 bereits unterstützt) für fixe Größe.

    cu André


Anmelden zum Antworten