2-dim. Array mit Pointer an Funktion übergeben?



  • Hey Leute!

    Ich hab folgenden Code:

    #include<iostream>
    using namespace std;
    
    void initSpielfeld(char** spielfeld)
    {
    
    }
    
    int main()
    {
    	char spielfeld[15][13];
    
    	initSpielfeld(spielfeld);
    
    }
    

    Nur funktioniert das Ganze nicht so wie ich das will. Was ist da falsch?



  • void initSpielfeld((*spielfeld)[13])
    


  • mal anders rum gefragt, was funktioniert denn nicht?
    fehlermeldung?



  • sry war jetzt mein fehler

    void initSpielfeld( char (*spielfeld)[13])
    

  • Mod

    struct Spielfeld
    {
     char feld[15][13];
    };
    
    void initSpielfeld(Spielfeld &feld)
    {
    }
    
    int main()
    {
        Spielfeld spielfeld;
        initSpielfeld(spielfeld);
    }
    

    Aber bevor du groß weiter machst, empfehle ich dir, ein Lehrbuch(kapitel) über Objektorientierung in C++ zu lesen.



  • Skym0sh0 schrieb:

    mal anders rum gefragt, was funktioniert denn nicht?
    fehlermeldung?

    Funktioniert nicht heisst vermutlich: compiliert nicht 🙂
    Und zwar genau deshalb nicht, weil spielfeld bei der Übergabe nicht wie vom TE wahrscheinlich angenommen in einen pointer-to-pointer-to-char zerfällt.

    sebi91 schrieb:

    sry war jetzt mein fehler

    void initSpielfeld( char (*spielfeld)[13])
    

    Und woher weisst du nun, wie gross die erste Dimension ist?
    Besser und immernoch schlecht:

    void initSpielfeld( char spielfeld[][13], std::size_t dimension1) {
    //...
    }
    


  • die C-Lösung, kaum krisensicherer wäre:

    void initSpielfeld(char * Field,size_t dimensionX,size_t dimensionY)

    Anmerkung:
    C kann keine Exeptions. Fehler musst ueber die Funktions-Signaturen zurueckgeben.
    deshalb haben C-Style die meisten Funktionen, wo Fehler auftreten koennen, die aber nicht zu terminate führen sollen, einen FehlerCode als RueckgabeWert.

    int initSpielfeld(char * Field,size_t dimensionX,size_t dimensionY)

    sieht schon eher wie klassisches C aus.

    noch nen Tick Krisensicherer geht es mit Safety Funktionen aehnlich den _s funktionen der Winapi. Ob das so viel bringt und den Aufwand lohnt ... k.A. kommt auf den Anwendungsfall an.

    Aber wie gesagt, das ist allertiefstes C !

    C++ Style ware:

    - RAII - Klassen die sich selber initalisieren ! Also Init funktionen überfluessig machen.
    - Dyn. Speicherallokation den Containern ueberlassen.

    also Dynamisch statt C-Arrays -> std::vector
    Mussen es StackKlassen sein, dann C-Array's ordentlich kapseln. Mit denen will ausserhalb keiner zu tun haben !
    boost::Array bietet da einige Template-basierte Ansaetze!

    Ciao ...



  • inter2k3 schrieb:

    Und woher weisst du nun, wie gross die erste Dimension ist?
    Besser und immernoch schlecht:

    der compiler weis schon selber wann die erste dimesion zu ende ist
    nur bei der zweiten dimension ist eine angabe nötig



  • Wenn die Groesse immer gleich ist reicht auch einfach void initSpielfeld(char spielfeld[15][13]);



  • Bitte nutze doch eine Klasse die einen einfach geschachtelten Vektor enthält.


Anmelden zum Antworten