Teil eines mehrdimensionalen arrays übergeben



  • Hi,
    ich bin neu hier und poste hoffentlich in das richtige Topic.
    Nun erstmal mein Code:

    float **x=new float*[3];
     for(int i=0;i<3;i++){
      x[i]=new float[2];//Anlegen des 3*2Arrays
     }
    x[0][0]=1;x[0][1]=2;//manuelles Füllen
    x[1][0]=4;x[1][1]=3;
    x[2][0]=5;x[2][1]=6;
    
    test(x[0])
    

    wobei

    void test(const float *x){
     cout<<x[0]<< " "<<x[1]<<endl;
    }
    

    Ich versuche die erste "Zeile" des mehrdimensionalen Arrays zu übergeben und dann in der Funktion (in diesem Beispiel ) 1 und 2 auszugeben.
    Was mache ich falsch?

    Vielen Dank Cryp


  • Mod

    Eigentlich würde man bei Benutzung von new für Arrays ja sagen "falsch, nimm vector!". Hier ist es sogar noch fälscher, da deine Arrays sogar statische Größe haben und daher std::array noch wesentlich besser wäre. Egal, mit beiden Klassen entfallen jegliche Arten von Übergabeproblemen (beim std::array liegt es nahe, die Größe als Templateargument zu nutzen). Oder noch besser: Gib Anfang und Ende des zu übergebenen Bereichs an (so wie bei den Funktionen der Standardbibliothek), dann ist es völlig egal, welche Art von Objekt vorliegt. Prinzipiell geht das dann sogar mit deinen rohen Arrays (aber benutz sie besser trotzdem nicht!).

    Zu deinem unmittelbaren Problem: Was ist dein Problem? Du sagst nicht, was nicht funktioniert. Wenn man mal die ganzen Schreibfehler rausmacht (d.h. Semikolons und Sternchen richtig setzt)

    float **x=new float*[3];
    for(int i=0;i<3;i++){
     x[i]=new float[2];//Anlegen des 3*2Arrays
    }
    x[0][0]=1;x[0][1]=2;//manuelles Füllen
    x[1][0]=4;x[1][1]=3;
    x[2][0]=5;x[2][1]=6;
    
    test(x[0]);
    

    dann ist das zwar furchtbarer Code, aber es sollte prinzipiell funktionieren:
    http://ideone.com/dqNFb8



  • Hi, danke für die schnelle Antwort.
    Ich hatte lediglich vergessen das Sternchen im Funktionenargument zu setzen. 😡
    Trotzdem vielen Dank. Ich werde auch noch mal die von dir angesprochenen Wege ausprobieren. Wenn es Schwierigkeiten gibt meld ich mich nochmal.


  • Mod

    cryptonize schrieb:

    Ich werde auch noch mal die von dir angesprochenen Wege ausprobieren. Wenn es Schwierigkeiten gibt meld ich mich nochmal.

    Hier eine Anregung, wie so etwas aussehen könnte:

    #include <array>
    #include <iostream>
    
    template <typename Iterator> void test(Iterator begin, Iterator end)
    {
        for(;begin != end; ++begin)
            std::cout << *begin << ' ';
        std::cout << '\n';
    }
    
    int main()
    {
        std::array<std::array<int, 2>, 3> foo = {{{1,2}, {3,4}, {5,6}}};
        test(foo[0].begin(), foo[0].end());
    }
    

    http://ideone.com/VglQU1


Anmelden zum Antworten