pointer 2 dimensionales array



  • ALLES NEU 🙂

    habe es jetzt geschafft 😉

    void identity(int (*)[10]); //muss ich das so definieren? geht mir nicht ganz ein, wie wird das gelesen? array von 10 elementen welche pointer auf ints sind?
    
    int main()
    {
     int square[10][10];
     int (*row)[10] = square;
    
      //show the addresses of each row 
      for(int i = 0; i < 10; ++i)
     	cout << *(row+i) << endl; 
      //distance is exactly 28hex (40dec) 
      //which is 10times a int per row
    
     identity(row);
    
     cout << endl;
     return 0;
    }
    
    void identity(int (*tst)[10]) //es war das prob dass ich die klammern rund um den pointer vergessen habe, warum brauche ich die klammern? also auch hier wieder die frage wie es interpretiert wird. ???
    {
     cout << "in identity\n" << *tst;
    
    }
    


  • zusatz, habe jetz auf verschiedenste arten versucht das array zu initialisieren - klaglos gescheitert 😡
    also falls jemand hier neu liest, es geht um obigen code, hier moechte ich in der funktion das array initialisieren, verwendet werden duerfen nur pointer (definiert in zwei vorschleifen)

    mein idee:

    for(int *x = *row; x != *(row+9); x += sizeof(int)*10)
    

    ich mache einen int pointer (fuer zeile) welchen ich so lange um 10 ints inkrementiere (10 da jede zeile 10 ints hat) und das ganze so lang bis der pointer die adresse des letzen array elemntes bekommt.
    nur funktioniert es nich 😃

    will das endlich verstehen...



  • Was soll deine Funktion jetzt genau machen? Das ist mir in diesem Thread nicht ganz klar geworden...

    Falls es nur darum geht, ein 2D-Array mit Nullen zu füllen, kannst du Folgendes tun. Ich würde es zuerst mal mit operator[] versuchen, das ist einleuchtender. Wenn du das wirklich verstanden hast, kannst du immer noch direkte Zeigerarithmetik verwenden.

    // (1): statisches Array mit Initialisierungsliste
    int Array[w][h] = {};
    
    // (2): statisches Array mit For-Schleife
    int Array[w][h];
    for (unsigned int x = 0; x < w; ++x)
    {
        for (unsigned int y = 0; y < h; ++y)
        {
            Array[x][y] = 0;
        }
    }
    
    // (3): dynamisches Array
    int** Array = new int*[w];
    for (unsigned int x = 0; x < w; ++x)
    {
        Array[x] = new int[h];
        for (unsigned int y = 0; y < h; ++y)
        {
            Array[x][y] = 0;
        }
    }
    // beim dynamischen Array wieder in umgekehrter Reihenfolge delete[] anwenden.
    


  • hallo nexus, danke fuer die antwort!
    das ist mir alles klar, ich habe das problem mit den pointern..
    nohcmals genaue aufgabnestllung:

    arry der groeße [10][10] diese wird in main definiert, in main wird ein pointer gemacht der auf die diversen zeilen zeigt. also p[0] = adresse erste zeiel ... p[9] = adresse letzt zeile

    dieser pointer wird an ne funktion uebergeben. diese fuellt das array mit lauter nullen, außer in der diagonale, da sind es einsen! [0][0],[1][1] usw....

    dazu folgende bestimmungen:
    2 for schleifen
    eine zuweisungszeile
    in der fkt darf nur der parameter + 2 pointer der for schleifen verwendet werden.

    hoert sich nicht so schwer an, ist es aber ^^



  • Sowas?

    void identity(int *p){
      for(int y = 0; y < 10; y++)
        for(int x = 0; x < 10; x++)
          p[y*10+x] = x == y;
    }
    


  • nein noch ein mal, es duerfen nur pointer verwendet werden!
    und das array wir in main initialisiert mitterls:

    int square[10][10];
    

    und uebergeben wird ein array von pointern (oder weiß jemand eine besser idee, zb nur einen pointer uebergeben?)

    danke...



  • AbsoluterBeginner schrieb:

    nein noch ein mal, es duerfen nur pointer verwendet werden!

    Ich denke, du meinst nicht Zeiger selber, sondern Zeigerarithmetik. Zudem ist Array[i] äquivalent mit *(Array+i) , aber du darfst natürlich gerne den komplizierteren Weg einschlagen. Wenn du wirklich der Ansicht bist, man dürfe den operator[] nicht verwenden (was eine ziemlich blöde Aufgabenstellung wäre), würde ich ihn trotzdem zuerst benutzen und anschliessend seine Vorkommen nach obiger Regel durch operator* und operator+ ersetzen.

    AbsoluterBeginner schrieb:

    und uebergeben wird ein array von pointern (oder weiß jemand eine besser idee, zb nur einen pointer uebergeben?)

    Arrays können nicht übergeben werden, es sind immer nur Zeiger.



  • Sowas?

    void identity(int *p){
      for(int *y = p; y-p < 100; y++)
        *y = !((y-p)%11);
    }
    

    entweder mit identity(&square[0][0]) aufrufen oder entsprechend anpassen.



  • als hinweis ist gestanden an soll pointer aritmetik veerwenden (nicht nur um zu prüfen ob ein element in der diagonalen ist)
    was meinst du denn damit?

    @fellhuhn, danke, aber ich habe es nicht geschafft das 2dim array mit einem pointer zu uebergeben, aber ich denke auch ich soll ein 1dim array mit den adressen der zeilen uebergeben...
    aber dien code sieht schon mal gut aus (da eben pointer verwendet werden)
    aber ich glaube du hast es schon zu kompakt gemacht 😃
    ich verstehe die zuweisung nicht ganz, waere es nicht auch einfacher mit 2 forschleifen?
    so sollte ich es naemlich loesen...

    danke euch!!



  • Also, ganz ehrlich, wenn gefordert ist, dass eine zweidimensionale Matrix übergeben werden soll, dann würde ich das auch ganz stumpf so machen. Ich würde das dann irgendwie so machen (nicht getestet):

    const size_t dim = 10;
    
    typedef int ElementType;
    typedef ElementType MatrixType[dim][dim];
    
    void identity(MatrixType mat)
    {
        for(ElementType (*row)[dim] = mat; row != (mat + dim); ++row)
        {
            for(ElementType *col = *row; col != (*row + dim); ++col)
            {
                if(row - mat == col - *row)
                {
                    *col = 1;
                }
                else
                {
                    *col = 0;
                }
            }
        }
    }
    
    //Test:
    MatrixType matrix;
    identity(matrix);
    //vielleicht noch ausgeben
    


  • Hier habe ich das mal ein wenig näher beschrieben, was du für möglichkeiten hast:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-212469-and-highlight-is-array+2+dimensionales.html



  • hallo, nochmals vielen dank an alle, heute war abgabe und ich habe es nicht geschafft, was solls 🙂
    will das problem aber trotzdem verstehen und habe mit hierzu ein weiteres programm gebastelt.
    da es aber nichts mit diesem thread zu tun hat habe ich einen neun aufgemacht, wenn wer lust hat zu helfen keine scheu 😃

    hier der link: http://www.c-plusplus.net/forum/viewtopic-var-p-is-1607316.html#1607316

    danke euch!


Anmelden zum Antworten