Mehrdimensionale Arrays an Zeiger übergeben???



  • Wieso kann ich keine Mehrdimensionalen Arrays an Zeiger übergeben und wie kann ich das umgehen?



  • In C übergebe ich den Pointer auf das erste Element sprich [0][0]..[0],
    den Rest kann ich mir in der Funktion berechnen, Notfalls mus ich die einzelnen Dimensionen übergeben.

    Vielleicht gibt es in C++ dafür einen moderneren Weg



  • Danke aber das habe etwas komisches Herausgefunden und zwar:

    short test[3];
    test[0]=11;
    test[1]=12;
    test[2]=13;
    short *ptest=0;
    ptest=test;
    cout << ptest << '\n';
    

    gibt er 11 aus wenn ich aber z.b.

    short test[3];
    test[0]=11;
    test[1]=12;
    test[2]=13;
    short *ptest=0;
    ptest=test;
    cout << ptest[0] << '\n' << *ptest++ << '\n';
    

    gibt er mir erst 12 und dann 11 aus (müßte doch umgekehrt sein oder) 😕 😕 😕



  • Zweitens geht auch so:

    short test[3];
    test[0]=11;
    test[1]=12;
    test[2]=13;
    short *ptest=0;
    ptest=test;
    cout << *ptest++ << '\n' << *ptest++ << '\n'
    

    erst 12 dann 11
    und das Versteh ich nicht



  • bei << wird eine funktion aufgerufen
    mit den parameter
    *t++ und *t++

    nun kann der compiler die parameter von links nach rechts oder noch rechts nach links auswerten - das darf er sich aussuchen (das ist noetig um optimale performance zu ermoeglichen).

    du kannst also nicht sicher sein was zuerst erhoeht wird...
    fest steht nur, dass nachher t um 2 erhoeht wurde!



  • Darum musst du ihn zur logischen Reihenfolge quasi "zwingen".

    short test[3];
    test[0]=11;
    test[1]=12;
    test[2]=13;
    short *ptest=test;
    for(int i=0;i<3;i++)
    {
       cout << *ptest << '\n';
       ptest++;
    }
    


  • @Shade Of Mine
    thx 🙂
    Allerdings weiß ich immer noch nicht wie ich Pointern Mehrdimensionale Arrays zuweisen kann, hab schon in der MSDN und in einem Referenz-Buch geschaut. -> Fehlanzeige



  • 😃 Guter Witz 😃
    Du machst es in deinem Beispiel richtig
    ob du
    short test[3];
    oder
    short test1[3][5];
    schreibst

    Deine Zuweisung bekommst du mit

    short *ptest=test;
    short *ptest1=test1;

    Noch Fragen.



  • Aber das so wie du schreibst mach

    #include <iostream> 
    using namespace std; 
    #define for if(false);else for 
    
    int main() 
    { 
    	short test[3][3];
    	short *ptest = 0;
    	for(int i = 0; i == 3; i++)
    		for(int j = 0; i == 3; j++)
    			test[i][j] = j;
    	ptest = test;
    
    	cout << ptest[0][1];
    	return 0;
    }
    

    Bekomme ich nur drei Kompilerfehler:

    C:\Wissen\VC++\My Projects\test\test.cpp(13) : error C2440: '=' : 'short [3][3]' kann nicht in 'short *' konvertiert werden
    Die Typen, auf die verwiesen wird, sind nicht verwandt; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
    C:\Wissen\VC++\My Projects\test\test.cpp(15) : error C2109: Index benoetigt ein Feld oder einen Zeigertyp



  • Hier die Änderugen damits läuft.
    Schau die bitte deine for Schleifen Konstruktion an, sie tut glaube ich nicht das was sie sollte, ich habe sie deswegen geändert.

    #include <iostream>  
    using namespace std;  
    #define for if(false);else for  
    
      int main()  
    {  
        short test[3][3]; 
        short *ptest = 0; 
        for(int i = 0; i < 3; i++) 
            for(int j = 0; j < 3; j++) 
                test[i][j] = j+i*3; 
        ptest = &test[0][0]; 
    
        cout << "i" << " " << "j" << " " << "Value" <<"\n" ;
        for(int i = 0; i < 3; i++) 
            for(int j = 0; j < 3; j++) 
        cout << i << " " << j << " " << *(ptest+i*3+j) <<"\n" ;
        return 0; 
    }
    

    :p Für folgende zwei Zeilen such ich unter C++ noch bessere Formulierungen. :p

    ptest = &test[0][0]; 
    *(ptest+i*3+j)
    


  • kurze verständnisfrage: ein Array repräsentiert meines wissens nach doch einen Zeiger auf das erste element. Warum also noch "&" vor das array?



  • ptest = &test[0][0];

    test zeigt auf das erste seiner Elemente, das ist korrekt, aber es wird doch nicht von test die Adresse ermittelt sondern von dem ersten short (test[0][0]).
    Man könnte also auch

    ptest = &(test[0][0]);

    schreiben.



  • @THE_FreaK

    Danke das du meine Frage wiederholst.

    😡
    Für folgende zwei Zeilen suche ich unter C++ noch bessere Formulierungen.

    ptest = &test[0][0];  
    *(ptest+i*3+j) und nicht *(ptest[i][j])
    

    😡

    Jetzt meine blöde Antwort: Anderfalls compilerts und funktionierts nicht

    Blöde Antwort deshalb weil ich keine Erklärung habe.

    @Dennis danke für die Antwort, hast du für das zweite auch noch was



  • Warum macht ihr nicht einfach so was in der Art?

    template<typename T>
    T** alloc2d(unsigned cx, unsigned cy)
    {
      T** ppt = new T*[cx];
      for(unsigned i = 0; i < cy; ++i)
        ppt[i] = new short[cy];
      return ppt;
    }
    
    int main()
    {
      short** pps = alloc2d<short>(10, 10);
      pps[9][9] = 10;
      return 0;
    }
    


  • Für

    short test[5][3];
    short* ptest = &test[0][0];   
    *(ptest+i*3+j)
    

    müsste man auch das hier schreiben können:

    short test[5][3];
    short *ptest = reinterpret_cast<short*>(test); // hier wird ein mehrdimensionales Array zu einem Pointer gecastet.
    ptest[i*5+j];// oder: (i*5+j)[ptest];
    

    Zumindest funzte der Code mal bei mir (auch wenn er nich hübsch is).



  • @MaSTaH Danke für die C++ Lösung

    Das war mein erster Beitrag zu diesem Thema:

    In C übergebe ich den Pointer auf das erste Element sprich [0][0]..[0],
    den Rest kann ich mir in der Funktion berechnen, Notfalls mus ich die einzelnen Dimensionen übergeben.

    Vielleicht gibt es in C++ dafür einen moderneren Weg

    Habe auf grund meines Wissens nur eine sinnvolle C lösung anbieten können und gehoft das ein C++ Beispiel auch noch kommen würde.



  • @DennisB

    Interessant wäre hier eine Lösung mit getrennten Dimensionen, so das ich die Position im Vektor nicht selber ausrechenen muss



  • Wenn man die multidimensionalen Arrays als einfachen Array behandeln will, muss man schon selbst rechnen lassen.



  • Was ich als Anmerkung bei meinem Vorschlag vegessen habe: Der Speicher ist dann AFAIK nicht zwangsläufig an einem Stück.



  • 🙂 Was man teilweise als Nachteil sehen muss, wenn man so ein feld effektiv und schnell über pointer mathematisch bearbeiten will 🙂



  • Ok, ich muss mich wol damit abfinden es selbst immer zu errechnen. Aber wieso ist das so, muss doch einen Grund geben oder


Anmelden zum Antworten