Neuling braucht Hilfe: Mehrdimensionales Array übergeben



  • So versuch ichs:

    {
        double A[2][3] = {{1,2,3},{4,5,6}};
    
        Call_Method(A);
    
    }
    
    Class::Call_Method(double **A)
    {
    
    }
    

    wo liegt denn da mein Fehler bitte?

    Habe im Netz genau das gleiche gefunden wo es anscheinen gehen soll:

    double array[100][2];
    Klasse2.SetArray(array);
    void SetArray(double **array,int x,int y)
    

    Kann es an den erstellen werten liegen? Das kann ich mir aber nicht erklären denn ich übergebe ja nur einen Pointer auf das erste Element des MultiArrays???



  • Hallo

    einfach mal in der Suchfunktion hier im Forum nach *mehrdimen* suchen.

    bis bald
    akari



  • Mati schrieb:

    So versuch ichs:
    ...wo liegt denn da mein Fehler bitte?
    ...

    Das ist eine gute Frage ! 😉
    Was sagt denn der Compiler ?
    Oder compiliert das Teil sauber durch und liefert nur nicht das, was Du erwartest ?

    Gruß,

    Simon2.



  • Warum immer selbstbeasteln?

    typedef map< imt, map< int, double > > Array2D;
    Array2D array2d;
    ...
    double d = array2d[1][2];
    


  • Mati schrieb:

    So versuch ichs:

    {
        double A[2][3] = {{1,2,3},{4,5,6}};
    
        Call_Method(A);
    
    }
    
    Class::Call_Method(double **A)
    {
    
    }
    

    wo liegt denn da mein Fehler bitte?

    Die Typen sind schlicht und ergreifen nicht kompatibel. Man könnte auch sagen, dass *A vom Typ double[3] ist und nicht vom Typ double*, wie es die Funktion erwartet.

    BTW vom eindimensionalen Fall auf den mehrdimensionalen Fall zu schliessen und zunächst anzunehmen, dass man das so übergeben kann wie du oben ist nachzuvollziehen. Aber dass man das dann auch im Netz publiziert, ohne es ein einziges mal ausprobiert zu haben, ist schon ein starkes Stück 👎. Man kann nur immer wieder davor warnen, sich allzusehr auf Online-Tutorials zu stützen.

    Die einzige Möglichkeit, das Array direkt zu übergeben:

    void Call_Method(double (*A)[3])
    

    (OK nicht ganz, es gibt noch 2 andere Syntaxvarianten, aber am Ende sind die äquivalent. Man muss auf jeden Fall alle Dimensionen ausser der äußersten (der linken) angeben.)

    Es gibt noch die Möglichkeit, von vornherein eine andere Array-Repräsentation zu nutzen, die besonders bei dem häufigen Fall, dass die Dimensionen zur Übersetzungszeit nicht bekannt sind, besser geeignet ist: Man übergibt statt eines mehrdimensionalen Arrays (was es eigentlich nicht gibt, das sind Arrays die Arrays enthalten) ein Array von Pointern:

    double *A[3];
    for (int i = 0; i < 3; ++i)
      A[i] = new double[irgendwas];
    funktion(A);
    ...
    void funktion(double *A[]) // oder double **A
    

    Es gibt natürlich noch jede Menge weiterer mehr oder weniger (s. Vorposter :p ) sinnvoller Varianten.



  • Bashar schrieb:

    Es gibt natürlich noch jede Menge weiterer mehr oder weniger (s. Vorposter :p ) sinnvoller Varianten.

    Wieso weniger sinnvoll?



  • STL doch nicht so Pro? schrieb:

    Bashar schrieb:

    Es gibt natürlich noch jede Menge weiterer mehr oder weniger (s. Vorposter :p ) sinnvoller Varianten.

    Wieso weniger sinnvoll?

    Kurz: Um ein Array darzustellen, schießt du mit 'ner map<> etwas über's Ziel hinaus. Da wären vector<>en vermutlich geeigneter.



  • typedef map< int, double > Array1D;
    typedef map< int, Array1D > Array2D;
    Array2D array2d;
    for( int i = 0; i != 100; ++i )
    {
        Array1D array1d;
        for( int j = 0; j != 20; ++j )
        {
            array1d.insert( make_pair( j, 0 ) );
        }
        array2d.insert( make_pair( i, Array1D ) );
    }
    ...
    array2d[0][0] = 1;
    array2d[0][1] = 2;
    array2d[0][2] = 3;
    array2d[1][0] = 4;
    array2d[1][1] = 5;
    array2d[1][2] = 6;
    ...
    double d = array2d[1][2];
    ...
    CallMethode( array2d );
    ...
    Class::CallMethode( Array2D& A )
    {
        double d = A[1][2];
    }
    

    Ist doch schöner als das Zeigergefummel..



  • STL doch der Pro schrieb:

    Ist doch schöner als das Zeigergefummel..

    CStoll schrieb:

    Da wären vector<>en vermutlich geeigneter.

    ... 🙄



  • LordJaxom schrieb:

    STL doch der Pro schrieb:

    Ist doch schöner als das Zeigergefummel..

    CStoll schrieb:

    Da wären vector<>en vermutlich geeigneter.

    ... 🙄

    ..ups, zu spät gesehn. Haste recht



  • STL doch der Pro schrieb:

    Ist doch schöner als das Zeigergefummel..

    Schöner vielleicht, aber nicht gerade elegant ... man muss sich auch fragen, wieso du dich mit C++ abplagst, wenn dir Performance derart egal ist, da gibt es doch viel schönere Alternativen.



  • Aber dass man das dann auch im Netz publiziert, ohne es ein einziges mal ausprobiert zu haben, ist schon ein starkes Stück

    wie kann man nur so eine ...... Aussage bringen? Wenn ich es nicht ausprobiert hätte würde ich doch nicht posten? Das wäre ja völliger Schwachsinn.

    Ich gebe offen zu wenn ich mich vielleicht dumm anstelle und nicht die Compilermeldung mit angegebn habe und länger brauche um zu schnallen wie arrays tatsächlich funktionieren aber ich gebe auch zu dass ich das Netz gebraucht habe (google, suchfunktion etc.) und leider auf keinen Grünen zweig gekommen bin. Wenn jemand keine Lust hat zu posten dann soll er es einfach lassen.

    Danke trotzdem für Eure Hilfe - natürlich funktioniert es jetzt mit eurer Hilfe!
    Danke



  • Mati schrieb:

    wie kann man nur so eine ...... Aussage bringen? Wenn ich es nicht ausprobiert hätte würde ich doch nicht posten? Das wäre ja völliger Schwachsinn.

    Ich red ja nicht von dir, sondern von dem, der das Tutorial geschrieben hat. Sonst wär es in der Tat Schwachsinn.



  • Bashar schrieb:

    STL doch der Pro schrieb:

    Ist doch schöner als das Zeigergefummel..

    Schöner vielleicht, aber nicht gerade elegant ... man muss sich auch fragen, wieso du dich mit C++ abplagst, wenn dir Performance derart egal ist, da gibt es doch viel schönere Alternativen.

    Du ich hab mir jetzt nochmal den FAQ Beitrag angesehn, da steht aber nicht wirklich, welche Variante nun wirklich gute Performance bringt..



  • ah so, sorry dann nehm ich mein graulen zurück.
    Muss aber gestehen dass es schon passiert ist dass user unfreundlich posten.

    Danke nochmals


Anmelden zum Antworten