mehrdim. dyn. array als Fkt-parameter



  • Hallo,

    ich habe ein kleines Problem mit mehrdimensionalen arrays, die mit new erzeugt werden. Wenn ich diese als Fkt-parameter übergeben möchte, bekomme ich compiler fehlermeldungen:

    [Error] cannot convert 'double**' to 'double ()[3]' for argument '1' to 'int testfunktion(double ()[3])'

    Hier ist der zugehörige Code:

    #include <iostream>
    
    using namespace std;
    
    int testfunktion( double zeiger[][3] );
    
    int main()
    {
    	int a = 3;
    	double ** zeiger = new double * [a];
    	zeiger[0] = new double [3];
    	zeiger[1] = new double [3];
    	zeiger[2] = new double [3];
    
    	zeiger[0][0] = 5;
    	zeiger[1][0] = 5;
    	zeiger[2][0] = 5;
    
    	zeiger[0][1] = 5;
    	zeiger[1][1] = 5;
    	zeiger[2][1] = 5;
    
    	zeiger[0][2] = 5;
    	zeiger[1][2] = 5;
    	zeiger[2][2] = 5;
    
    	testfunktion(zeiger);
    }
    
    int testfunktion( double zeiger[][3] )
    {
    	cout << zeiger[0][0] << "\t" << zeiger[1][1] << "\t" << zeiger[2][2];
    	cin >> zeiger[0][0];
    }
    

    wäre schön, wenn jemand weiterhelfen könnte (sry falls es so einen ähnlichen Eintrag schon gibt, habe nichts gefunden)


  • Mod

    Mach C++ in C++, kein C in C++:
    new -> vector
    Arrayübergabe -> Iteratoren
    low-level Gefrickel -> Abstraktion

    Weiterhin sind ganz allgemein 2D-Arrays keine Doppelzeiger, wie du es in Zeile 10 versuchst, daher klappt das auch nicht.



  • SeppJ schrieb:

    new -> vector

    heap -> stack

    double zeiger[3][3] = {
      5,5,5,
      5,5,5,
      5,5,5,
    };
    

  • Mod

    doppelzeiger schrieb:

    double zeiger[3][3]
    

    😃 👍



  • ok, ich weiche dann jetzt auf vector aus. gibt es da auch extended initializer lists oder geht das nur so wie ich oben angegeben hab, also jedes element einzeln zuweisen.

    doppelzeiger schrieb:

    double zeiger[3][3] = {
      5,5,5,
      5,5,5,
      5,5,5,
    };
    

    ich kenne bei der Kompilierung die Dimension noch nicht. Deshalb hab ich das so nicht gemacht.

    SeppJ schrieb:

    Mach C++ in C++, kein C in C++:

    was ist an meinem Code denn C und nicht C++?

    SeppJ schrieb:

    Weiterhin sind ganz allgemein 2D-Arrays keine Doppelzeiger, wie du es in Zeile 10 versuchst, daher klappt das auch nicht.

    solange ich das array nicht als Funktionsparameter übergebe, funktioniert das in meinem eigentlichen Programm wunderbar.



  • badstyleprogrammerr schrieb:

    ich kenne bei der Kompilierung die Dimension noch nicht.

    Sicher?



  • da sich die Dimension aus den Daten ergibt, und die Daten während der Laufzeit des Programms gelesen/geändert werden, bin ich mir fast sicher, dass ich mir sicher bin. 😉



  • Aber das 3 ist doch fix?

    std::vector<std::array<int,3> >
    


  • das ist ja nicht der richtige Code, den ich da geposted hab. ich pflanze hier doch keine 800 Zeilen Code ins Forum. Es ging nur darum, dass der Beispielcode den gleichen Compiler error ausspuckt wie mein eigentliches Problem.


  • Mod

    badstyleprogrammerr schrieb:

    was ist an meinem Code denn C und nicht C++?

    Die genannten drei Punkte.

    solange ich das array nicht als Funktionsparameter übergebe, funktioniert das in meinem eigentlichen Programm wunderbar.

    Und meinst du nicht, dass dies ein Hinweis sein könnte, dass da etwas nicht stimmt?



  • Die Frage macht aber nur Sinn, wenn mindestens eine Dimension konstant ist. Bei int[3][3] sind beide konstant, bei std::vector<std::array<int,3> > nur eine.



  • SeppJ schrieb:

    new -> vector
    Arrayübergabe -> Iteratoren
    low-level Gefrickel -> Abstraktion

    seit wann ist new den nicht C++?

    im Prinzip wird beim Funktionsaufruf nicht das array, sondern nur der Zeiger auf das array übergeben, und Zeiger sind meines Wissens nach auch Iteratoren, also verstehe ich die Bemerkung nicht.

    mit der dritten Bemerkung kann ich sowiso nichts anfangen.



  • doppelzeiger schrieb:

    Die Frage macht aber nur Sinn, wenn mindestens eine Dimension konstant ist. Bei int[3][3] sind beide konstant, bei std::vector<std::array<int,3> > nur eine.

    nur "a" soll als variabel angesehen werden.


  • Mod

    badstyleprogrammerr schrieb:

    SeppJ schrieb:

    new -> vector
    Arrayübergabe -> Iteratoren
    low-level Gefrickel -> Abstraktion

    seit wann ist new den nicht C++?

    im Prinzip wird beim Funktionsaufruf nicht das array, sondern nur der Zeiger auf das array übergeben, und Zeiger sind meines Wissens nach auch Iteratoren, also verstehe ich die Bemerkung nicht.

    mit der dritten Bemerkung kann ich sowiso nichts anfangen.

    Alle drei deiner Erwiderungen bestätigen bloß, dass ich absolut Recht hatte. Leider bist du, anstatt daraus zu lernen, irgendwie in einen komischen Beißreflex übergegangen. Nun, dann werde ich wohl lieber nicht weiter füttern.



  • badstyleprogrammerr schrieb:

    seit wann ist new den nicht C++?

    Syntaktisch schon. Es geht hier jedoch um guten Stil, Exceptionsicherheit und RAII. new ist da ein klassisches Beispiel.

    im Prinzip wird beim Funktionsaufruf nicht das array, sondern nur der Zeiger auf das array übergeben, und Zeiger sind meines Wissens nach auch Iteratoren, also verstehe ich die Bemerkung nicht.

    Ja, aber sie sind als Iteratoren für einen allgemeinen Algorithmus (sehr) unflexibel und damit unpassend. Mit Iteratoren meint SeppJ, dass die Funktion* ein Iteratorenpaar auf Start und End einer Menge nimmt, wobei der Iteratoren-Typ ein Templateparameter ist.

    ~*Die ja eigentlich, wie im darauf folgenden Text impliziert wird, keine Funktion ist, sondern ein Funktionstemplate~



  • @ SeppJ
    Ich wollte hier nicht verbohrt rüberkommen (schließlich habe ich ja die Frage gestellt und somit zugegeben, dass ich nicht der Experte bin), sondern lediglich diskutieren, denn einige deiner knappen und unverständlichen Kommentare haben mich nicht weitergebracht.

    @ Sone
    Danke, das habe ich jetzt verstanden.

    ps: ich hab jetzt vector anstatt new benutzt und es geht. Vielen Dank


Anmelden zum Antworten