Pointer auf mehrdimensionales Array zurückgeben



  • Javaner schrieb:

    Woher bitte soll der Compiler wissen, wie groß die
    2. Dimension ist, also wo arr[2] beginnt?

    Muss er nicht wissen. arr[2] ist (arr+2), und das ist ein double, den er nur dereferenzieren muss. Er muss keine Adresse berechnen. Dass verschachtelte Arrays (es gibt eigentlich keine 2D-Arrays) und Zeigerarrays beim Dereferenzieren gleich aussehen kann manchmal verwirrend sein ...

    C++ ist nicht Java wo Arrays ihre Länge mitgespeichert haben.
    Eine Längenangabe gibt es in C++ für Arrays nicht.

    Komisches Argument. In Java gibts überhaupt keine verschachtelten Arrays wie in C++, sondern nur Arrays die wieder Pointer auf Arrays enthalten. Die Länge ist dabei vollkommen egal.

    Man kann sogar noch weiter gehen, daß es in C++ überhaupt keine Arrays
    gibt; nur Zeiger auf irgendetwas. Das Konstrukt namens Array kennt nur der
    Compiler.

    Wenn der Compiler es kennt ist das gut genug, wer soll es denn noch kennen?



  • Javaner schrieb:

    Man kann sogar noch weiter gehen, daß es in C++ überhaupt keine Arrays
    gibt; nur Zeiger auf irgendetwas. Das Konstrukt namens Array kennt nur der
    Compiler.

    Habe ich denn das Gegenteil behauptet?!
    Ich definiere Array als eine Speicheradresse, die auf eine bestimmte Anzahl von Elementen vom Typ X zeigt, welche hintereinander gespeichert sind. Die Anzahl dieser Elemente ist zur Laufzeit nicht herausfindbar...

    Wo liegt jetzt aber das Problem konkret in meinem Code?!



  • Trundle0x7e schrieb:

    aber das geht 100%tig:

    int main()
    {
    	int** p=new int*[10];
          ...
    

    Ja! Weil hier der Compiler weiß, daß jedes Element auf das
    p zeigen kann eben 10 int-Elemente enthält.

    (Glaube ich jetzt zumindest 😕 )



  • Javaner schrieb:

    Trundle0x7e schrieb:

    aber das geht 100%tig:

    int main()
    {
    	int** p=new int*[10];
          ...
    

    Ja! Weil hier der Compiler weiß, daß jedes Element auf das
    p zeigen kann eben 10 int-Elemente enthält.

    (Glaube ich jetzt zumindest 😕 )

    Nö. Das ist ein 10-elementiges Array von int-Pointern. Was du meinst sähe so aus:

    int (*p)[10] = new /* new-syntax ist schwer und ich hab keinen Bock nachzugucken, die Deklaration links ist das entscheidende */
    


  • Habe ich was verpasst?! Auch wenn er es nicht wissen sollte, wo liegt das Problem?!

    #include <iostream>
    using namespace std;
    
    int main()
    {
    	int iNumElements;
    	cout << "Wie viele Reihen/Zeilen wünschst du, sehr junger Padawan?" << endl;
    	cin >> iNumElements;
    
        int** p=new int*[iNumElements];
        for(int i=0;i<iNumElements;i++)
        {
            p[i]=new int[iNumElements];
            for(int j=0;j<iNumElements;j++)
            {
                p[i][j]=i*iNumElements+j+1;
            }
        }
    
        cout << "Der 1337 test part 2: Ausgabe von int** p" << endl;
    
        for(int i=0;i<iNumElements;i++)
        {
            for(int j=0;j<iNumElements;j++)
            {
                cout << p[i][j] << " ";
            }
    
            cout << endl;
        }
    
        cout << "Der 1337 testpart 2 ist jetzt vorbei :(" << endl;
    
        return 0;
    }
    

    By the way: Warum hindert mich dieser Spamschutz vorm posten?!



  • Bashar schrieb:

    Javaner schrieb:

    Woher bitte soll der Compiler wissen, wie groß die
    2. Dimension ist, also wo arr[2] beginnt?

    Muss er nicht wissen. arr[2] ist (arr+2), und das ist ein double, den er nur dereferenzieren muss. Er muss keine Adresse berechnen. Dass verschachtelte Arrays (es gibt eigentlich keine 2D-Arrays) und Zeigerarrays beim Dereferenzieren gleich aussehen kann manchmal verwirrend sein ...

    Ich bezog mich auf diesen Code-Ausschnitt:

    int main() 
    { 
        double** arr= Calc(); 
    
        cout << arr[0][0] << endl; 
        cout << arr[1][0] << endl; 
        cout << arr[0][5] << endl; 
        cout << arr[9][5] << endl;
    }
    

    Woher soll hier denn der Compiler wissen, wo arr[1] beginnt?

    Bashar schrieb:

    C++ ist nicht Java wo Arrays ihre Länge mitgespeichert haben.
    Eine Längenangabe gibt es in C++ für Arrays nicht.

    Komisches Argument. In Java gibts überhaupt keine verschachtelten Arrays wie in C++, sondern nur Arrays die wieder Pointer auf Arrays enthalten. Die Länge ist dabei vollkommen egal.

    Eben! Das meinte ich doch.

    Bashar schrieb:

    Man kann sogar noch weiter gehen, daß es in C++ überhaupt keine Arrays
    gibt; nur Zeiger auf irgendetwas. Das Konstrukt namens Array kennt nur der
    Compiler.

    Wenn der Compiler es kennt ist das gut genug, wer soll es denn noch kennen?

    Stimmt! Ich vergaß, daß C++ ja keine Interpreter-Sprache ist. 🙄



  • Javaner schrieb:

    Ich bezog mich auf diesen Code-Ausschnitt:

    int main() 
    { 
        double** arr= Calc(); 
    
        cout << arr[0][0] << endl; 
        cout << arr[1][0] << endl; 
        cout << arr[0][5] << endl; 
        cout << arr[9][5] << endl;
    }
    

    Woher soll hier denn der Compiler wissen, wo arr[1] beginnt?

    Wie ich schon sagte, er muss es nicht wissen. Es reicht, wenn die Adresse zur Laufzeit in arr[1] steht.



  • Also ich weiß nicht ob wir aneinander vorbeireden.

    Was soll denn z.B. dieser Code bewirken?

    double **Calc() {
           return (double **) malloc(sizeof(double *));
    }
    
    int main() 
    { 
        double** arr= Calc(); 
    
        arr[0][0] = 1; 
        arr[1][0] = 2; 
    }
    


  • Bashar schrieb:

    Dass verschachtelte Arrays und Zeigerarrays beim Dereferenzieren gleich aussehen kann manchmal verwirrend sein ...

    Ich glaube, langsam meinen Denkfehler zu verstehen... 🙄



  • Wow, wahnsinn!!
    So viele Antworten in so kurzer Zeit...

    Danke erstmal, ich brauche jetzt wohl erst mal n bisschen Zeit um das alles zu verstehen... 🙄

    Tausend Dank und Gruss
    GierAffe



  • Javaner schrieb:

    Was soll denn z.B. dieser Code bewirken?

    Einen Absturz, weil arr[0] nicht initialisiert ist.


Anmelden zum Antworten