Mehrdimensionale Arrays an Zeiger übergeben???



  • 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



  • Guck doch mal in die FAQ. Da steht soweit ich weiß auch ein laaanger Artikel von Dimah zu dem Thema drin 😉 .



  • @ MaSTaH Danke, jetzt ist mir einiges klarer geworden, trotzdem finde ich die erklährung wieso:

    [quote]Den Zeiger auf ein zweidimensionales Array zeigen lassen.
    Wichtig: Die zweite Dimension muss mit der Array-Größe
    übereinstimmen, mit der der Zeiger deklariert wurde
    pArr = new int [5][2]; wäre z.B. illegal, da ein Zeiger auf ein
    Array mit 5 Elementen nicht in einen Zeiger auf ein Array mit
    2 Elementen konvertiert werden kann.
    [quote]
    nicht gerade die beste, da eien Array ja auch nur ein pointer auf den ersten Wert ist und somit auch illegal wäre (bleibt wohl für immer ein Mysterium


Anmelden zum Antworten